【发布时间】:2012-02-07 12:02:31
【问题描述】:
我正在用 python 编写一个多线程解压缩器。每个线程需要访问输入文件的不同块。
注意 1:无法加载整个文件,因为它的范围从 15 Gb 到 200 Gb;我不是使用多线程来加速数据读取,而是数据解压,我只是想确保数据读取不会减慢解压速度。
注意2:GIL不是问题,这里,因为主解压器函数是一个C扩展,它调用Py_ALLOW_THREADS,所以GIL在解压的时候被释放。第二阶段解压使用同样无 GIL 的 numpy。
1) 我认为简单地共享一个 Decompressor 对象(它基本上包装一个文件对象)是行不通的,因为如果线程 A 调用以下内容:
decompressor.seek(x)
decompressor.read(1024)
和线程 B 做同样的事情,线程 A 可能最终从线程 B 偏移读取。这是正确的吗?
2) 现在我只是让每个线程创建自己的 Decompressor 实例,它似乎可以工作,但我不确定这是最好的方法。 我考虑了这些可能性:
-
添加类似的东西
seekandread(from_where, length)到获取锁、寻找、读取和释放锁的 Decompressor 类;
创建一个等待读取请求并按正确顺序执行它们的线程。
那么,我错过了一个明显的解决方案吗?这些方法之间是否存在显着的性能差异?
谢谢
【问题讨论】:
-
如果您有硬盘驱动器,以多线程方式读取文件实际上会减慢进程。针必须从一个地方跳到另一个地方,而不是以迭代的方式工作。您应该在处理之前加载文件。
-
不可能加载整个文件,因为它的范围从 15 Gb 到 200 Gb;我不是使用多线程来加速数据读取,而是数据解压,我只是想确保数据读取不会减慢解压速度。
-
当然,这可能适用于 SSD,也可能不适用于 SSD。我对这个主题一无所知。你不应该依靠硬件来做到这一点。一旦 SSD 足够普遍,以多线程方式执行 I/O 可能会很有效。
-
能否请您在问题中澄清一下?
-
好的,我已经添加了注释
标签: python multithreading file-io