- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
TL;DR
给定一个包含一百万条记录的文件,其中文件中的每一行都需要执行大量逻辑,那么读取文件并完成在每一行上应用逻辑的最快方法是什么。我使用了带有文件读取器的多线程步骤,其 read
方法是synchronized
读取文件并使用 AsynItemProcessor
以便在自己的线程中处理记录。
我的期望是 AsynItemProcessor
一旦有来自读取器的记录需要处理,就应该立即开始。每个记录应该在自己的线程中处理;但是,在我下面的示例中似乎并非如此
我的 Spring 批处理作业中有一个步骤使用 TaskExecutor
使用 20 个线程和 10000 次提交间隔来读取文件。我也在使用 AsycnItemProcessor
和AsyncItemWriter
因为数据处理有时可能比从文件中读取一行所需的时间更长。
<step id="aggregationStep">
<tasklet throttle-limit="20" task-executor="taskExecutor">
<chunk reader="fileReader"
processor="asyncProcessor" writer="asyncWriter"
commit-interval="10000" />
</tasklet>
</step>
地点:
fileReader
是一个扩展 FlatFileItemReader
的类和 read
方法是 synchronized
只需调用 super.read
在其中。 asyncProcessor
只是一个AsyncItemProcessor
从文件中传递每一行并按键对其进行分组的 bean,并将其存储到包含 Map<String,BigDecimal>
的单例 bean 中目的。换句话说,处理器只是将文件数据按几列进行分组,并将这些数据存储在内存中。 asyncWriter
无非是AsyncItemWriter
包装 no 操作 ItemWriter
在其中。换句话说,该作业不需要进行任何类型的写入,因为处理器本身正在进行聚合并将数据存储在内存中。 (Map
)。AsynItemProcessor
有它的ThreadPoolTaskExecutor
与 corePoolSize=10
和maxPoolSize=20
和 Step
有自己的ThreadPoolTaskExecutor
与 corePoolSize=20
和maxPoolSize=40
通过上述设置,我的期望是读取和处理将并行发生。像这样的东西:
AsyncItemProcessor
执行聚合。因为它是AsyncItemProcessor
,调用 process
的线程理想情况下,方法应该可以自由地执行其他工作?AsynItemWriter
会得到Future
并提取数据,但不执行任何操作,因为委托(delegate)是无操作 ItemWriter
.但是当我添加一些日志时,我没有看到我期望的内容:
2019-09-07 10:04:49 INFO FileReader:45 - Finished reading 2500 records
2019-09-07 10:04:49 INFO FileReader:45 - Finished reading 5000 records
2019-09-07 10:04:50 INFO FileReader:45 - Finished reading 7501 records
2019-09-07 10:04:50 INFO FileReader:45 - Finished reading 10000 records
2019-09-07 10:04:51 INFO FileReader:45 - Finished reading 12500 records
2019-09-07 10:04:51 INFO FileReader:45 - Finished reading 15000 records
... 更多这样的行被打印,直到整个文件被读取。只有在读取文件后,我才开始看到处理器开始工作:
2019-09-07 10:06:53 INFO FileProcessor:83 - Finished processing 2500 records
2019-09-07 10:08:28 INFO FileProcessor:83 - Finished processing 5000 records
2019-09-07 10:10:04 INFO FileProcessor:83 - Finished processing 7500 records
2019-09-07 10:11:40 INFO FileProcessor:83 - Finished processing 10000 records
2019-09-07 10:13:16 INFO FileProcessor:83 - Finished processing 12500 records
2019-09-07 10:14:51 INFO FileProcessor:83 - Finished processing 15000 records
底线:为什么处理器在文件完全读取之前才启动?不管怎样ThreadPoolTaskExecutor
用于 AsynItemProcessor
的参数或整个step
,读取总是先完成,然后才开始处理。
最佳答案
这就是面向 block 的处理的工作原理。该步骤将读取变量中的 X 个项目(其中 X 是提交间隔),然后执行处理/写入。您可以在 code of ChunkOrientedTasklet
中看到这一点.
在多线程步骤中,每个 block 将由一个线程处理。
关于java - Spring 批处理 : Multithreaded step with AsyncItemProcessor doesn't run in parallel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57840342/
我正在尝试将我的 xcode 应用程序存档到 Itunes,但我得到了 following errors : 1.) “配置文件不支持推送通知。” 2.) “配置文件不包含 aps-environme
我正在尝试为我们的组织构建一个 Web 应用程序,它将使用我们的 O365 进行身份验证。在尝试使用管理员帐户连接到域时,我遇到了这个错误,其中提到 admin..onmicrosoft.com(全局
当我尝试构建 MUAI 项目时,它给出错误“该项目不知道如何运行配置文件 sample.WinUI”。项目已构建但无法运行。我使用的是 Visual Studio 2022 Preview(17.0
当某项包含在列表中时,有一个查询要搜索,但当某项不在列表中时,则没有查询。 此查询查找在给定列表 cdiffnums 中没有 ContactNum 的 customer 对象。我该怎么做才能仅返回此列
我们有一个黑盒第三方 Java 程序,可以从某个位置获取输入文件并制作 PDF。每次输入时,它都会将 list 文件放在同一位置,这需要我们以受控方式提供文件。 list (或 .xen/.que)是
我看到这个has选择器,hasnt 选择器在哪里?我想查找不包含图像的表格。 最佳答案 类似$("table:not(:has(img))")? 关于jQuery: "Doesn' t 有“选择器?,
为什么?这让我发疯??? $(document).ready(function () { $('#slides1').bxSlider({ prev_
我是 kubernetes 的新手。 我无法使用 kubectl 进行部署,但我可以在 kubernetes 仪表板上看到所有部署。我该如何解决这个问题? user@master:~$ kubectl
这个问题已经有答案了: What do querySelectorAll and getElementsBy* methods return? (12 个回答) 已关闭 6 年前。 HTML JS
我有两个数组,一个包含字符串值,另一个包含整数值,尽管这可能很愚蠢,但我陷入了困境,我需要一点帮助,我想遍历两者,如果 arr1 包含 arr2 中不存在的项目,它将被推送到 newArray 这是我
我一直在尝试为我的网站安装一个 PHP 脚本,设置所有内容,通过脚本附带的 phpMyAdmin 导入 SQL 文件,但我面对的是一个空白页面,错误如下所示: File /home/user/publ
我正在努力将站点的服务器从 PHP 5.2.17 升级到 5.5,以使其在未来的升级中保持新鲜,并安装其他需要 PHP 5.4+ 的软件。 数据库有一个我正在测试的表,其中有许多列在初始 INSERT
我一直收到这个错误: Object doesn't support this property or method 每当我在 IE7 和 IE8 中运行我的代码时。这是它停止的代码: _renderU
我想使用正则表达式排除某些单词。 输入文本: aaa1234 cc bbb1234 c1234 cc dd aacc cccc ccadf cc 输出文本: aaa1234 bbb1234 c1234
我有一个名为 adjust_status 的存储函数和一个包含 status 列的表 users。 select adjust_status(status) as adjusted_status
我有一个表,其中有一列由插入前触发器填充,该列设置为 NOT NULL 并且没有DEFAULT VALUE。 当我执行 INSERT TABLE 而不传递此列时,我收到错误:1364 - Field
这个问题已经有答案了: Modify the value of each textfield based on original value using jQuery (3 个回答) 已关闭去年。 使
我正在阅读 this , 它说 @keyframes rules don't cascade, so animations never derive keyframes from more than
编辑:我解决了问题,请参阅答案中的链接。 我正在使用 XMLHttpRequest AJAX API 将来自不同网站的数据发送到我们在 PythonAnywhere 中的服务器。奇怪的事情发生了:根据
我已经阅读了 Linux 调用 dlopen() 和 dlsym() 的文档,它们分别打开一个动态库并在库中加载一个符号。 这些调用似乎等同于 Windows 的 LoadLibrary() 和 Ge
我是一名优秀的程序员,十分优秀!