gpt4 book ai didi

Python内存不足错误,多线程子目录递归

转载 作者:行者123 更新时间:2023-11-28 18:38:14 24 4
gpt4 key购买 nike

我第一次尝试递归,在扫描大型目录时遇到了问题。以下代码采用 glob 模式列表(例如,['/opt/data/large_dir_1*', '/opt/data'large_dir_2']),扩展 glob 模式,将生成的文件/目录列表传递给线程,沿途总计找到的目录数、找到的文件数以及找到的文件的总字节大小。子目录很大(其中几个有数十万个目录,数百万个文件),但令我惊讶的是我生成的一些线程正在抛出“MemoryError”异常。

我的猜测是问题的发生是因为“dirList”和“fileList”变量占用了太多内存。我的备份计划是让递归函数简单地将数据写入日志文件而不是返回它,但我试图尽可能避免使用“全局”变量。有没有人对更好的方法有任何想法?我在这里做傻事吗?感谢您提供的任何帮助。

def Scan(masterFileList, baseDir='/'):
dirList = []
fileList = []
byteCount = 0
for fileOrDir in masterFileList:
fullName = os.path.join(baseDir,fileOrDir)
if os.path.isdir(fullName):
dirList.append(fullName)
# recursion: call Scan():
dirs, files, bytes = Scan(os.listdir(fullName),fullName)
dirList.extend(dirs)
fileList.extend(files)
byteCount += bytes
elif os.path.isfile(fullName):
fileList.append(fullName)
byteCount += os.path.getsize(fullName)
return dirList, fileList, byteCount


dirList = []
fileList = []
byteCount = 0
errorList = []

def doScan(dataQueue):
print('Thread starting')

while not dataQueue.empty():
globPattern = dataQueue.get()
globbed = glob.glob(globPattern)
if globbed:
dirs, files, bytes = Scan(globbed)
# if we have a lock:
with safePrint:
dirList.extend(dirs)
write_to(dirLog, 'a', dirs)
fileList.extend(files)
write_to(fileLog, 'a', files)
byteCount += bytes
# convert to string for writing:
write_to(byteLog, 'w', str(byteCount))
else:
# if we have a lock:
with safePrint:
errorList.append(globPattern)
write_to(errorLog, 'a', globPattern)

print('Thread exiting')

numthreads = 0
for globPattern in globList:
dataQueue.put(globPattern)
numthreads += 1

# initialize threads:
threads = []
for i in range(numthreads):
thread = threading.Thread(target=doScan, args=(dataQueue, ))
threads.append(thread)
thread.start()

# wait until threads are done:
for thread in threads: thread.join()

最佳答案

这听起来像是 os.walk 的完美用例,它让您可以使用简单的 for 循环递归遍历文件系统。官方文档在https://docs.python.org/3/library/os.html#os.walk包含一个与您的用例非常相似的示例。

如果你想进行多线程处理,你可以启动工作线程来消耗 queue.Queue 中的项目,你可以从这个 for 循环中填充这些项目。

关于Python内存不足错误,多线程子目录递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30308472/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com