在Python中读取多个大文件时内存泄漏



我面临内存问题加载多个文本文件

我决定把一个很大的文件分成30个小文件,以便更好地处理它们。这些文件大约为1.7GB,我的RAM为28GB。我的目的是读取每个文件的行并更新计数器,然后读取下一个文件的行,以此类推

for filename in filenames:
tracemalloc.start()
with open(path + '/' + filename) as file_reader:
lines = file_reader.readlines()
print(f"Read {filename}: {len(lines)} lines")
for line in tqdm(lines):
counter.update(list(line))

我已经看到,在行:lines = file_reader.readlines()之后,我的RAM占用在每一步后都会增加3GB,因此在9次迭代后,该过程被终止。

我试图用sys.getsizeof方法打印局部变量的占用情况,但它们似乎没有达到这些值,所以我尝试用gc.collect()使用垃圾收集器,但它没有改变任何东西。

我不明白每次迭代后是否保留了文件的一些内存,或者与sys.getsizeof相比,变量linescounter是否达到了更高的值。

有什么想法吗?

我做这件事是出于30年前的记忆。

这里有一个在shell中操作51GB文件的简单方法。您所需要的只是大量的磁盘空间,而不需要ram。

cat文件|排序-T/tmp|uniq-c>out.results

如果您分别对30个较小的文件进行排序,您可以通过使用-m标志进行排序来使用mergesort。

您确实意识到counter.update是一个哈希表而不是整数,对吗?如果每个文件是1.7GB,每个文件在记忆力除非所有的线条基本相同。

最新更新