我是处理大量数据的新手。我想知道批量查询数据库时是否有任何最佳实践,或者是否有人可以提供任何建议。
我有一个查询将提取所有数据,并使用 PHP 将数据写入 XML 文件。数据可能在 10 到 500,000 行之间,因此我编写了脚本以 50 行为一组提取数据,写入文件,然后获取接下来的 50 行,将其附加到文件等。这样可以吗?或者我应该做点别的事情?我可以增加批处理大小还是应该减少它以使脚本运行得更快?
任何建议将不胜感激。
我正在尝试批量插入/更新 SqlDataAdapter。当我设置 UpdateBatchSize = 1 时,它可以工作,但将其设置为 2 会出现异常“指定的参数名称 'Id' 无效。”。
using (var sqlDataAdapter = new SqlDataAdapter
{
UpdateBatchSize = 2
})
using (var connection = new SqlConnection("Data Source=server;Initial Catalog=DB;Integrated Security=True"))
using (var command = new SqlCommand("INSERT INTO Test (Id) VALUES (@Id)", connection)
{
UpdatedRowSource = UpdateRowSource.None
})
{
command.Parameters.Add("Id", SqlDbType.Int).SourceColumn = "Id";
sqlDataAdapter.InsertCommand = command;
var table = new DataTable("Test");
table.Columns.Add("Id");
table.Rows.Add(1);
table.Rows.Add(2);
sqlDataAdapter.Update(table);
}
Run Code Online (Sandbox Code Playgroud) 我有一个批处理作业,它使用从数据库读取HibernateCursorItemReader,使用自定义处理器处理结果,然后提交到另一个数据库。
我想显示的是相对于要处理的总项目数已处理了多少项目。
我尝试实现一个自定义JobExecutionListener,以@beforeJob从第一个表中获取行计数,然后可以Job Execution定期将其与提交进行比较。
有没有比使用监听器更好的方法Job Execution。是否可以在第一次读取时获取表的总行数,在HibernateCursorItemReader初始化期间设置一个值或类似的值?
工作
<batch:job id="SomeLongJob" job-repository="jobRepository" restartable="true">
<batch:listeners>
<batch:listener ref="batchJobExecutionListener" />
</batch:listeners>
<batch:step id="first1">
<tasklet transaction-manager="hibernateTransactionManager">
<chunk reader="hibernateItemReader"
processor="batchCustomProcessor"
writer="hibernateItemWriter"
skip-limit="0"
commit-interval="10">
</chunk>
</tasklet>
</batch:step>
</batch:job>
Run Code Online (Sandbox Code Playgroud)
读者
<bean id="hibernateItemReader"
class="org.springframework.batch.item.database.HibernateCursorItemReader">
<property name="queryString" value="from MyTable" />
<property name="sessionFactory" ref="sessionFactory" />
</bean>
Run Code Online (Sandbox Code Playgroud) 任何人都可以指出这个活动批次在那里挂了好几个星期并且从未被处理的原因是什么?非常感谢。
我的猜测是执行者不够,更多的工人/执行者会解决问题吗?或者 Spark 在其任务调度程序中为不同的批次分配优先级?
但这里的情况是,最近的批次(6 月底)已成功处理,但 5 月的批次仍在排队。
我刚刚检查了我的 Spark 设置,调度程序策略是 FIFO
spark.scheduler.mode FIFO
Run Code Online (Sandbox Code Playgroud)
最近我开始工作,我的第一个任务是编写一个批处理文件,该文件自动将文件名更改为带有原始文件结尾的 filename_date。为此,您应该能够将路径写入文本文件(例如,paths.txt),并且当您启动程序时,它应该从那里获取任何行(=path->file)并重命名它。我让它在我的电脑上安静地工作,但当我把它交给测试时,他们要求使用通配符成为Z:\Path\*.*可能。我当前的代码如下所示:
@echo off
setlocal EnableDelayedExpansion
cd %~dp0
For /F "tokens=*" %%m in (paths.txt) do (
set path=%%~dpm
set name=%%~nxm
pushd "!path!"
dir
For /r !path! %%f in (!name!) do (
set path=%%~dpf
set name=%%~nf
set ending=%%~xf
set datsave=%%~nxf
set "name=!name!_"
set "name=!name!!date:~6,4!"
set "name=!name!!date:~3,2!"
set "name=!name!!date:~0,2!"
set "name=!name!!ending!"
copy "!datsave!" "!name!"
del "!datsave!"
cls
popd
)
)
Run Code Online (Sandbox Code Playgroud)
我知道很多事情可能更容易、更有效,但这是我的第一批项目,除了通配符问题外,我很高兴。所以一个例子是:
C:\Some\Path\*.*
这一行将在paths.txt 中。随着分裂
set path=%%~dpf
set name=%%~nf
set ending=%%~xf
set datsave=%%~nxf
Run Code Online (Sandbox Code Playgroud)
我得到以下信息:
path: C:\Some\Path
name: C:\Some\Path
ending: -empty-
datsave: …Run Code Online (Sandbox Code Playgroud) 目的是创建一个 TfRecords 数据库。鉴于:我有 23 个文件夹,每个文件夹包含 7500 个图像和 23 个文本文件,每个文件都有 7500 行描述单独文件夹中 7500 个图像的功能。
我通过以下代码创建了数据库:
import tensorflow as tf
import numpy as np
from PIL import Image
def _Float_feature(value):
return tf.train.Feature(float_list=tf.train.FloatList(value=[value]))
def _bytes_feature(value):
return tf.train.Feature(bytes_list=tf.train.BytesList(value=[value]))
def _int64_feature(value):
return tf.train.Feature(int64_list=tf.train.Int64List(value=[value]))
def create_image_annotation_data():
# Code to read images and features.
# images represent a list of numpy array of images, and features_labels represent a list of strings
# where each string represent the whole set of features for each image.
return images, features_labels …Run Code Online (Sandbox Code Playgroud) 目标:使用 for 循环生成 100 个条形图,并将输出显示为子图图像
数据格式:具有 101 列的数据文件。最后一列是 X 变量;剩下的 100 列是 Y 变量,针对这些变量绘制了 x。
所需输出:5 x 20 子图阵列中的条形图,如本示例图像所示:
当前方法:我一直在 seaborn 中使用 PairGrid,它生成一个 nx 1 数组:
.
其中输入==数据帧;input3 == 调用列标题的列表:
for i in input3:
plt.figure(i)
g = sns.PairGrid(input,
x_vars=["key_variable"],
y_vars=i,
aspect=.75, size=3.5)
g.map(sns.barplot, palette="pastel")
Run Code Online (Sandbox Code Playgroud)
有没有人有任何想法如何解决这个问题?
Spring-Batch 提供了一个类FixedLengthTokenizer,它可以轻松地将单行的不同偏移量读取到对象的字段中。其中每个字段的内容是从固定长度的某些范围中提取的:
FixedLengthTokenizer tokenizer = new FixedLengthTokenizer();
String[] names = {"A", "B", "C", "D"};
tokenizer.setNames(names);
Range[] ranges = {new Range(1, 4), new Range(5, 12), new Range(13, 14), new Range(15, 15)};
tokenizer.setColumns(ranges);
Run Code Online (Sandbox Code Playgroud)
我想做完全相反的事情。我想将一个对象写入一个平面文件,其中不同的字段应该以固定长度写入文件。Spring-Batch 提供了org.springframework.batch.item.file.transform.LineAggregator将线映射到对象的接口。但我想知道为什么没有FixedLengthLineAggregator这样做?
Spring-Batch 中将对象写入字段具有固定长度的行的正确方法是什么?
我正在使用 opencv dnn 模块通过 CNN 发送一批图像。我尝试使用图像中的 opencv dnn blob 一次处理它们以生成 blob。但这比通过网络一张一张地发送每张图像需要更长的时间。处理一批图像应该更快吗?
我只是使用一个 for 循环来通过检测器,所以我知道它不是。零件是一组图像
blob = cv2.dnn.blobFromImages(
parts,
1.0,
(300, 300),
(104.0, 177.0, 123.0)
)
self._net.setInput(blob)
detectns = self._net.forward()
Run Code Online (Sandbox Code Playgroud)
批量处理 4 张图像大约需要 350 毫秒,而一张一张地处理它们大约需要 200-250 毫秒。
python opencv object-detection computer-vision batch-processing
如何快速关闭VS Code中所有打开的终端?
我有很多打开的终端,我可以一一检查它们并分别杀死它们。或者我可以选择其中的一些,然后杀死选定的批次。但这两种方法都不方便,因为它们需要大量时间。我至少有 10000 个开放终端,而在一批中我可以选择几百个。
有没有办法一次性杀死所有终端?
batch-processing ×10
python ×3
java ×2
spring ×2
spring-batch ×2
apache-spark ×1
batch-file ×1
batch-rename ×1
binary ×1
c# ×1
for-loop ×1
kill ×1
matplotlib ×1
mysql ×1
opencv ×1
php ×1
progress-bar ×1
subplot ×1
tensorflow ×1
terminal ×1