0

我正在使用循环读取许多(比如 1k)CERN ROOT 文件并将一些数据存储到嵌套的 NumPy 数组中。循环的使用使其成为串行任务,每个文件都需要相当长的时间才能完成该过程。由于我正在研究深度学习模型,因此我必须创建一个足够大的数据集——但读取时间本身需要很长时间(读取 835 个事件大约需要 21 分钟)。谁能建议是否可以使用多个 GPU 来读取数据,以便读取所需的时间更少?如果是这样,怎么做?

添加更多细节:我将程序推送到 GitHub,以便可以看到(如果不允许发布 GitHub 链接,请告诉我,在这种情况下,我将在此处发布相关部分):

https://github.com/Kolahal/SupervisedCounting/blob/master/read_n_train.py

我将程序运行为:

python read_n_train.py <input-file-list>

其中参数是一个文本文件,其中包含带有地址的文件列表。我在read_data_into_list()函数的循环中打开 ROOT 文件。但正如我所提到的,这个串行任务非常耗时。不仅如此,我注意到随着我们读取越来越多的数据,读取速度越来越差。

同时我尝试使用 slurmpy 包https://github.com/brentp/slurmpy 有了这个,我可以将作业分配到例如 N 个工作节点。在这种情况下,单个读取程序将读取分配给它的文件并返回相应的列表。只是最后,我需要添加列表。我想不出办法来做到这一点。

非常感谢任何帮助。

问候, 科拉哈尔

4

1 回答 1

1

您正在从 python 顺序循环所有事件,这可能是瓶颈。

您可以查看root_numpy以将您需要的数据从根文件加载到 numpy 数组中:

root_numpy 是一个 Python 扩展模块,它提供了 ROOT 和 NumPy 之间的高效接口。root_numpy 的内部是 C++ 编译的,因此可以比等效的纯 Python 实现更快地处理大量数据。

我目前也在研究看起来很相似的root_pandas 。

虽然此解决方案不能准确地响应并行化请求,但它可能使并行化变得不必要。如果它仍然太慢,那么它仍然可以使用 slurm 或其他东西并行使用。

于 2019-02-18T04:04:40.150 回答