我有一个目录,其中有大约数十万个文本文件 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循环中处理此步骤。
答案 0 :(得分:2)
如果目录非常大,那么您可以使用scandir()
代替os.listdir()
。但是os.listdir()
不太可能导致MemoryError
因此问题出现在其他两个地方:
使用生成器表达式而不是列表理解:
chunks = (lst[i:i+n] for i in range(0, len(lst), n))
使用pool.imap
或pool.imap_unordered
代替pool.map()
:
for result in pool.imap_unordered(Map, chunks):
pass
或更好:
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")