gpt4 book ai didi

java - 提高逐行读取文件和处理的性能

转载 作者:行者123 更新时间:2023-12-02 11:10:51 30 4
gpt4 key购买 nike

我有一段 java 代码,它执行以下操作 -

  1. 打开一个包含格式为 {A,B,C} 的数据的文件,每个文件大约有。 5000000 行。
  2. 对于文件中的每一行,调用一个提供 D 列的服务,并将其作为 {A,B,C,D} 附加到 {A,B,C}。
  3. 将此条目写入分块写入器,最终将 10000 行组合在一起,将 block 写回远程位置

目前代码需要 32 小时才能执行。此过程将在另一个文件中再次重复,假设还需要 32 小时,但我们需要每天运行这些过程。

由于有时服务没有 D,但被设计为从其 super 数据存储中获取 D,因此它会抛出一个暂时性异常,要求您等待,这一事实使第 2 步变得更加复杂。我们有重试来处理这个问题,因此从技术上讲,一个条目可以重试 5 次,最大延迟为 60000 毫秒。因此,在最坏的情况下我们可能会看到 5000000 * 5。

{A,B,C}的组合是唯一的,因此结果D无法缓存和重用,并且每次都必须发出新的请求来获取D。

我尝试添加这样的线程:

temporaryFile = File.createTempFile(key, ".tmp");
Files.copy(stream, temporaryFile.toPath(),
StandardCopyOption.REPLACE_EXISTING);
reader = new BufferedReader(new InputStreamReader(new
FileInputStream(temporaryFile), StandardCharsets.UTF_8));
String entry;
while ((entry = reader.readLine()) != null) {
final String finalEntry = entry;
service.execute(() -> {
try {
processEntry(finalEntry);
} catch (Exception e) {
log.error("something");
});
count++;
}

这里的processEntry方法抽象了上面解释的实现细节,线程定义为

ExecutorService service = Executors.newFixedThreadPool(10);

我遇到的问题是第一组线程启动,但该进程不会等到所有线程完成其工作并且所有 5000000 行都完成。因此,过去需要等待 32 小时完成的任务现在会在 <1 分钟内结束,这会扰乱我们系统的状态。有没有其他方法可以做到这一点?如何让进程等待所有线程完成?

最佳答案

  • 如果您想在任务完成时执行任务,请考虑使用 ExecutorCompletionService,您需要 ExecutorCompletionService。它充当 BlockingQueue,允许您在任务完成时轮询任务。
  • 另一个解决方案是等待执行程序终止,然后使用以下命令将其关闭:
    ExecutorService 服务 = Executors.newFixedThreadPool(10);
    服务.shutdown();
    while (!service .isTermminate()) {}

关于java - 提高逐行读取文件和处理的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50634402/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com