优化多个文件的并行处理

2023-11-29

我有一个程序处理很多文件,其中每个文件需要完成两件事:首先,读取并处理文件的某些部分,然后生成结果MyFileData被存储。第一部分可以并行,第二部分则不能。

按顺序执行所有操作非常慢,因为 CPU 必须等待磁盘,然后它会工作一点,然后发出另一个请求,然后再次等待......

我做了以下事情

class MyCallable implements Callable<MyFileData> {
    MyCallable(File file) {
        this.file = file;
    }
    public MyFileData call() {
        return someSlowOperation(file);
    }
    private final File file;
}

for (File f : files) futures.add(executorService.submit(new MyCallable(f)));
for (Future<MyFileData> f : futures) sequentialOperation(f.get());

这很有帮助。不过,我想改进两件事:

  • The sequentialOperation以固定顺序执行,而不是先处理任何可用的结果。我怎样才能改变它?

  • 有数千个文件需要处理,启动数千个磁盘请求可能会导致磁盘垃圾。通过使用Executors.newFixedThreadPool(10)我限制了这个数字,但我正在寻找更好的东西。理想情况下,它应该是自调整的,以便它在不同的计算机上以最佳方式工作(例如,在以下情况下发出更多请求)RAID and/or NCQ是否可用等)。我不认为它可以基于找出硬件配置,但测量处理速度并基于它进行优化应该somehow有可能。任何想法?


equentialOperation 以固定顺序执行,而不是先处理任何可用的结果。我怎样才能改变它?

这正是竣工服务作用:它并行处理任务并在完成后返回它们,无论提交顺序如何。

简化(未测试)示例:

int NUM_THREADS = Runtime.getRuntime().availableProcessors();
ExecutorService executor = Executors.newFixedThreadPool(NUM_THREADS);
CompletionService<MyFileData> completionService = new ExecutorCompletionService<MyFileData>(executor);

for (File f : files) futures.add(completionService.submit(new MyCallable(f)));

for(int i = 0; i < futures.size(); i++) {
    Future<MyFileData> next = completionService.take();
    sequentialOperation(next.get());
}

有数千个文件需要处理,启动数千个磁盘请求可能会导致磁盘垃圾。通过使用 Executors.newFixedThreadPool(10) 我限制了这个数字,但是我正在寻找更好的东西。

我对此不是 100% 确定。我想这取决于你有多少个磁盘,但我认为磁盘访问部分不应该分成太多线程(每个磁盘一个线程可能是明智的):如果许多线程同时访问一个磁盘,它会花更多的时间去寻找而不是阅读。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

优化多个文件的并行处理 的相关文章

随机推荐

  • jQuery: text() 和 html() 之间有什么区别?

    jQuery 中的 text 和 html 函数有什么区别 div html a href example html Link a b hello b vs div text a href example html Link a b hel
  • 转换unicode

    我有一个UITextField输入一个unicode值 当我点击UIButton需要将其转换并显示在UILabel 下面的代码对我来说工作正常 我的代码中的unicode NSString str NSString stringWithUT
  • 范围解析运算符和常量

    我们来看下面的代码 include
  • 类型擦除类型擦除,“有什么”问题吗?

    所以 假设我想使用类型擦除来键入擦除 我可以为变体创建伪方法 以实现自然的 pseudo method print auto self auto os os lt lt self std variant
  • 删除多维数组

    在 C FAQ 中 16 16 给出了以下示例 void manipulateArray unsigned nrows unsigned ncols typedef Fred FredPtr FredPtr matrix new FredP
  • MVC3 和 Code First 迁移 - “自数据库创建以来,支持‘blah’上下文的模型已发生变化”

    我使用 Entity Framework Code First 开始我的项目 当我准备好后 我将数据库和代码上传到我的主机提供商 一切顺利 我需要向我的一个类添加一个新字段 并且我不想丢失数据库中的数据 因此 我尝试关注一些有关使用 Cod
  • 如何使用 jQuery 更改元素的同级文本而不更改 html?

    我试图仅替换文本 但不触及任何其他标签 p a href login php i class fa fa sign in i Login a p p each function this text this text replace Log
  • 无法使用 MRTK v2.0.0-RC1 进行构建

    我曾尝试在 Unity 2018 3 10f1 上构建新 MRTK 版本 2 0 0 RC1 的场景示例 但每次每个示例都会出现构建错误 其中显示 找不到类型或命名空间名称 HandJointKind 您是否缺少 using 指令或程序集引
  • 在Python中,我可以调用导入模块的main()吗?

    在Python中我有一个modulemyModule py 我在其中定义了一些函数和一个main 它需要一些命令行参数 我通常从 bash 脚本中调用这个 main 现在 我想把一切都放进一个小package 所以我想也许我可以将我的简单b
  • 日期时间到数字以及向后转换

    R 中的日期 时间我有这个日期 2016 10 29 15 00 00 我想将其转换为数字并向后转换为我的相同日期和时间 我用它来将其转换为数字 as numeric as POSIXct 2016 10 29 15 00 00 我怎样才能
  • 如何在pyspark中使用多行选项将数据帧保存到json文件中

    在 Pyspark 中 我想将数据帧保存为 json 文件 但格式如下 说这是我的数据框 gt gt gt rdd1 show f1 f2 AAAAAAAAAA 99999 BBBBBBBBB 99999 CCCCCCCCC 99999 如
  • 在 FirebaseDatabase.getReference() 中获取 NPE

    我在应用程序启动时在生产版本中获得 NPE 并且在使用 adb 重新安装后仅获得一次 NPE Caused by java lang NullPointerException Attempt to invoke interface meth
  • 使用 DecorlatedJitterBackoff 的最大重试次数

    我正在使用 polly DecorlatedJitterBackoff 策略来重试 http 请求 我的用例是 当 timeSpan 达到 300 秒时 它应该每 300 秒重试 int maximum 次数 我正在尝试使用以下代码来实现此
  • 将 JPanel 中的 JLabel 定位在图像下方

    我想将给定示例中的文本移动到图像和形状下方 请帮我做一下 package test import java awt BasicStroke import java awt Graphics import java awt Graphics2
  • RestSharp 身份验证器遵循 302 重定向

    我正在尝试使用 RestSharp 向 API 发出请求 通过将请求重定向到登录服务器 使用基本凭据进行身份验证 获取 cookie 然后重定向回 API 来保护此 API 恐怕我无法控制这个 所以请求的顺序是 Request Respon
  • Swift:使用 WKWebView 的 createPdf 创建 pdf

    Edit 在找到问题 2 的解决方案后 并且给人的印象是问题 1 没有简单的 开箱即用的解决方案 我决定关闭这个问题 而专门针对分页问题创建另一个问题 我有两个问题WKWebViews createPDF configuration com
  • Threejs 拖动点

    我必须生成大量可以单独拖动的对象 此外 这些物体仅限于平面形状 例如矩形或圆形 起初 我使用简单的 CircleGeometries 将其放置在另一个几何图形 平面 内 拖动它们也很容易 但正如预期的那样 大约 200000 个它们的性能非
  • VSTS Microsoft 托管代理:虚拟机大小

    根据https github com MicrosoftDocs vsts docs blob master docs pipelines agents hosted mdMicrosoft 托管代理的虚拟机大小为 目前使用 Microso
  • 为什么 CSS 选择器/HTML 属性首选破折号?

    过去我总是使用下划线来定义class and idHTML 中的属性 在过去的几年里 我改用破折号 主要是为了使自己与社区趋势 不一定是因为它对我有意义 我一直认为破折号有更多的缺点 但我没有看到它的好处 代码完成和编辑 大多数编辑器将破折
  • 优化多个文件的并行处理

    我有一个程序处理很多文件 其中每个文件需要完成两件事 首先 读取并处理文件的某些部分 然后生成结果MyFileData被存储 第一部分可以并行 第二部分则不能 按顺序执行所有操作非常慢 因为 CPU 必须等待磁盘 然后它会工作一点 然后发出