jra*_*amm 5 python concurrency multithreading numpy multiprocessing
我将编写一个 python 程序,从文件中读取块,处理这些块,然后将处理后的数据附加到新文件中。它需要分块读取,因为要处理的文件通常大于可用的内存量,大大简化了伪代码,如下所示:
def read_chunk(file_object, chunksize):
# read the data from the file object and return the chunk
return chunk
def process_chunk(chunk):
#process the chunk and return the processed data
return data
def write_chunk(data, outputfile):
# write the data tothe output file.
def main(file):
# This will do the work
for i in range(0, numberofchunks, chunksize):
chunk = read_chunk(file_obj, chunksize)
data = process_chunk(chunk)
write_chunk(data, out_file)
Run Code Online (Sandbox Code Playgroud)
我想知道的是,我可以同时执行这 3 个方法吗?它是如何工作的?
即1个线程读取数据,1个线程处理数据,1个线程写入数据。当然,读取线程总是需要比处理线程领先一步,而处理线程需要比写入线程领先一步......
真正伟大的是能够同时执行它并在处理器之间分割它......
有关确切问题的更多详细信息:我将使用 GDAL 库从光栅文件中读取数据。这会将块/行读入 numpy 数组。处理过程只是对每个栅格像元与其邻居的值之间进行一些逻辑比较(哪个邻居的值低于测试像元以及其中哪个值最低)。将创建一个相同大小的新数组(边缘被分配任意值)来保存结果,并且该数组将被写入新的光栅文件。我预计除 GDAL 之外唯一的其他库将是 numpy,这也可以使该例程成为“cythonising”的良好候选者。
有关如何进行的任何提示?
编辑:
我应该指出,我们之前已经实现了类似的事情,并且我们知道与 I/O 相比,处理所花费的时间将是显着的。另一点是,我们将用于读取文件的库(GDAL)将支持并发读取......
gon*_*opp -2
我诚实的建议是现在不要担心优化(请参阅过早优化)。
除非您将执行大量操作(从您的描述来看似乎并非如此),否则 I/O 等待时间很有可能比处理时间大得多(即:I/ O是瓶颈)。
在这种情况下,在多个线程中进行处理是没有用的。拆分 I/O 和处理(如您所建议的)最多只会购买您n*proc_time,即n您处理的次数以及proc_time每个操作的处理时间(不包括 I/O)。如果proc_time远低于 I/O 时间,您将不会获得太多收益。
我会首先串行实现这个,检查 I/O 和 CPU 使用情况,然后才担心优化(如果看起来可能有利的话)。您可能还想尝试一次从文件中读取更多块(缓冲)。