【发布时间】:2020-08-24 17:43:50
【问题描述】:
我的硬盘上有大量文件(每个约 100kb)。 对于我算法的每一步,我需要随机选择并读取大约 1000 个文件。 我使用 python 和 numpy.load 来执行此操作,而且速度很慢。
如何加快速度? 我的直觉是(除了使用 SSD),我可以一次安排所有读取,并让操作系统找到一个最小化寻道时间的顺序。但是,我不确定如何在 python 中实现这一点。
- 可能spwan 1000个线程,每个线程执行一次读取?
- 是否有异步 numpy.load 或等效项?
感谢任何帮助!谢谢:)
【问题讨论】:
-
创建 1000 个线程可能无济于事。一方面,我怀疑你有 1000 个内核/CPU,所以线程最终会等待 CPU 访问很多。加上创建每个线程有一些开销。磁盘 IO 是主要问题。磁盘很慢。您是否立即需要所有 1000 个文件?您可以在处理已加载的文件时创建一个线程来在后台加载文件吗?或者可能将文件的内容移动到数据库并根据需要从数据库中提取?我不是一个 numpy 用户 - 也许它有更好的解决方案。
-
我不确定这是否可行。你的套装有多大?如果不是几 GB,我建议将所有内容加载到 RAM 中(一开始会花费大量时间,但可以避免重复读取文件),然后在那里进行随机选择。对于简单的异步读取,您可以使用 joblib (joblib.readthedocs.io/en/latest/parallel.html),但我不确定它是否会导致加速。
-
感谢您的建议!不幸的是,RAM 不足以容纳所有数据 (>500GB)。而且我已经尽可能多地预取/隐藏数据 I/O(使用 pytorch.DataSet)。根据我的理解,应该可以为操作系统提供我想要加载的文件列表,并且操作系统“找出”一种以最佳顺序加载它们的方法。这就是磁盘调度程序的用途,对吧? -->> @VladimírKunc 我会查看你的 joblib 链接,谢谢!
-
您是否通过查询磁盘为每一步选择文件?如果是,您可以列出磁盘中的文件路径,然后用随机的 1000 个数字对其进行索引,以获取每个步骤所需的文件。这会给你一点速度。除此之外,您可以使用多线程加载文件,例如,从一个线程加载前 500 个,从另一个线程加载剩余的 500 个。随心所欲增加线程数
-
@S4rt-H4K 我在内存中有一个文件路径列表,我从中随机抽取 N 个项目。