在 Python 中并行读取多个文件?

Reading many files in parallel in Python?

提问人:YoussefMabrouk 提问时间:8/19/2023 最后编辑:YoussefMabrouk 更新时间:9/2/2023 访问量:59

问:

我正在尝试对总大小为 3 Tb 的数据运行 Python 脚本来计算非常简单的统计数据。数据分为 3000 个目录,每个目录包含一个大小为 1Gb(“.trr”格式)的压缩文件。

为了加载数据,我使用用 C 语言实现的库(称为 mdanalysis)。我正在具有 64 个 CPU 内核和 250 Gb 内存的节点上运行分析。我使用 Joblib 并行遍历目录,我期望并行处理 64 个文件,因为这对于内存来说仍然很好。

但是当我通过 htop 执行和监控 CPU 使用率时,我只看到 10 个 CPU 内核填满了勉强 50%,这表明我的脚本是一场灾难。您能否提出脚本未按应有的方式执行的任何原因?除了有限的内存(这里不是这种情况)之外,我不明白为什么没有使用 CPU。通过 htop,我可以看到大多数进程都处于状态 D。

更新:我已经使用cProfile分析了我的代码,我可以看到大部分时间都花在{'_thread.lock'对象的'获取'方法}中。这让我感到困惑,因为我已经执行了独立的进程,而且在我的理解中,这不涉及线程锁减慢代码速度。线程锁是否显示是因为我正在读取文件?这是 I/O 限制的提示吗?

我正在研究一个最小的可重复示例(由于需要数据,这并不容易)。

python 并行处理 joblib

评论

0赞 OneCricketeer 8/19/2023
问题出在哪里?只要按预期工作,50% 就比所有 CPU 最大值 100% 要好
0赞 YoussefMabrouk 8/19/2023
它比预期的要慢得多,这些进程不是并行执行的。
1赞 OneCricketeer 8/20/2023
您是否能够将代码以及如何启动流程作为最小的可重现示例?也许您应该尝试多处理模块或 Dask / Pyspark 而不是 joblib?但是,Python不会像C / C++,Go或Rust那样快。另外,也许您应该将数据集分发到多个磁盘?还是加载到实际上用于分析的数据库中?我假设3TB是纯文本文件,而不是特定的二进制格式(什么是trr文件)?
1赞 Jérôme Richard 8/20/2023
如果 64 个开发人员共享同一台机器来编写应用程序,他们不会比 1 个开发人员快多少。这与内核相同。如果任务受磁盘限制(甚至内存限制),则使用 64 个内核是无用的。“3000 个目录”很多,操作系统或磁盘很有可能成为瓶颈。在这种情况下,内核将停止,等待磁盘准备就绪。您是否分析了脚本以检查瓶颈是什么?您是否检查过磁盘是否未饱和?
1赞 YoussefMabrouk 8/21/2023
更新:我已经使用cProfile分析了我的代码,我可以看到大部分时间都花在{'_thread.lock'对象的'获取'方法}中。这让我感到困惑,因为我已经执行了独立的进程,而且在我的理解中,这不涉及线程锁减慢代码速度。线程锁是否显示是因为我正在读取文件?这是 I/O 限制的提示吗?

答: 暂无答案