python列出n个文件然后在目录中接下来的n个文件并将其映射到映射器函数

时间:2014-12-12 11:27:10

标签: python mapreduce out-of-memory

我有一个目录,其中有大约数十万个文本文件 Python代码创建了这个文件的名称列表,

listoffiles = os.listdir(directory)

我在{strong> 64 部分

中使用listoffiles函数打破此lol
lol = lambda lst, sz: [lst[i:i+sz] for i in range(0, len(lst), sz)]
partitioned_listoffiles = lol(listoffiles, 64)

然后我将它汇集到 2 进程

pool = Pool(processes=2,)
single_count_tuples = pool.map(Map, partitioned_listoffiles)

Map函数中,我读取了这些文件并进行了进一步处理

我的问题是,如果我为包含数千个文件的小文件夹执行此代码,则此代码可以正常工作。它耗尽内存的大目录。我该如何解决这个问题。我可以读取前n个文件,然后读取n个文件并创建listoffiles并在for循环中处理此步骤。

2 个答案:

答案 0 :(得分:2)

如果目录非常大,那么您可以使用scandir()代替os.listdir()。但是os.listdir()不太可能导致MemoryError因此问题出现在其他两个地方:

  1. 使用生成器表达式而不是列表理解:

    chunks = (lst[i:i+n] for i in range(0, len(lst), n))
    
  2. 使用pool.imappool.imap_unordered代替pool.map()

    for result in pool.imap_unordered(Map, chunks):
        pass
    
  3. 或更好:

    files = os.listdir(directory)
    for result in pool.imap_unordered(process_file, files, chunksize=100):
        pass
    

答案 1 :(得分:1)

我遇到了一个非常类似的问题,我需要验证特定文件夹中是否存在一定数量的文件。问题是该文件夹可能包含多达2000万个非常小的文件。 根据我所学到的,不可能将蟒蛇listdir限制为一定数量的物品。

我的listdir需要花费很长时间来列出目录和大量内存,但设法在具有4GB RAM的VM上运行..

您可能希望尝试使用glob,这可能会使文件列表更小,具体取决于您的要求。

import glob
print glob.glob("/tmp/*.txt")