我在python中编写了一个多线程解压缩程序。每个线程需要访问不同的输入文件块。从python中的多个线程读取单个文件
注1:无法加载整个文件,因为它的范围从15 Gb到200 Gb;我没有使用多线程来加速数据读取,但数据解压缩,我只是想确保数据读取不会减慢解压。注意2:GIL不是问题,在这里,由于主解压缩函数是一个C扩展,它调用Py_ALLOW_THREADS,所以GIL在解压缩时被释放。第二阶段减压使用也是无GIL的numpy。
1)我认为这是行不通的去分享一个解压缩对象(这基本上包装了一个文件对象),如果线程A调用以下日期:
decompressor.seek(x)
decompressor.read(1024)
和线程B不相同,螺纹A可能最终从线程B偏移量读取。它是否正确?
2)现在我只是让每个线程创建自己的Decompressor实例,它似乎工作,但我不知道这是最好的方法。 我考虑这些可能性:
添加类似
seekandread(from_where, length)
到获取锁时,寻求,读取和释放锁解压缩类;
创建一个线程,等待读取请求并按正确的顺序执行它们。
那么,我是否错过了一个明显的解决方案?这些方法之间是否存在显着的性能差异?
感谢
以多线程方式读取文件实际上会减慢硬盘驱动器进程的速度。针必须从一个地方跳到另一个地方,而不是以迭代方式工作。您应该在处理文件之前加载文件。 – 2012-02-07 12:16:17
无法加载整个文件,因为它的范围从15 Gb到200 Gb;我没有使用多线程来加速数据读取,但数据解压缩,我只是想确保数据读取不会减慢解压。 – Alberto 2012-02-07 12:21:16
当然,这可能或可能不适用于SSD。我不知道这个问题。您不应该在硬件上进行中继。一旦SSD足够普及,以多线程方式执行I/O可能会很有效。 – 2012-02-07 12:21:56