【问题标题】:Python speed up random disk read on HDDPython加速硬盘上的随机磁盘读取
【发布时间】: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 个项目。

标签: python io


【解决方案1】:

我评论中的简单方法的一个非常简单的示例:

from threading import Thread
import timeit
arr=[]
def populate(content):
    for i in content:
        arr.append(i)
content1=[i for i in range(1,10000000)]
content2=[i for i in range(10000000,20000001)]

thread1=Thread(target=populate,kwargs={'content':content1})
thread2=Thread(target=populate,kwargs={'content':content2})

start = timeit.default_timer()
thread1.start()
thread2.start()
thread1.join()
thread2.join()
stop = timeit.default_timer()

print("time taken:",stop-start)

线程耗时 3.546857 秒,无线程耗时 4.7215586 秒

所以,有一点加速。您可以为您的问题添加更多线程,时间应该会进一步改善。

在您的情况下,您将使用 np.load 加载选定的 1000 个文件中的一小部分,然后将此数据附加到您的主数组中

【讨论】:

  • 感谢您花时间编写一些代码!但是,我注意到这与我的问题有什么关系,因为您在内存中执行所有操作 - 不涉及磁盘 I/O。还是我错过了什么?
  • 哦,是的,它不涉及任何 i/o。抱歉,我忘记了问题涉及磁盘 i/o。您可以尝试使用stackoverflow.com/questions/35328085/… 中的解决方案
猜你喜欢
  • 1970-01-01
  • 2017-01-27
  • 2012-07-09
  • 2011-10-21
  • 2020-01-03
  • 2019-11-22
  • 2018-05-09
  • 2012-05-15
  • 2012-11-16
相关资源
最近更新 更多