我面临内存问题加载多个文本文件。
我决定把一个很大的文件分成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
相比,变量lines
和counter
是否达到了更高的值。
有什么想法吗?
我做这件事是出于30年前的记忆。
这里有一个在shell中操作51GB文件的简单方法。您所需要的只是大量的磁盘空间,而不需要ram。
cat文件|排序-T/tmp|uniq-c>out.results
如果您分别对30个较小的文件进行排序,您可以通过使用-m标志进行排序来使用mergesort。
您确实意识到counter.update是一个哈希表而不是整数,对吗?如果每个文件是1.7GB,每个文件在记忆力除非所有的线条基本相同。