假设我们有一个很大的字符串列表,如果我将它保存为普通文本文件(单独一行中的每个元素),它的大小将为1GB;
目前我使用此代码保存列表:
savefile = codecs.open("BigList.txt", "w", "utf-8")
savefile.write("\r\n".join(BigList));
savefile.close()
一旦我们到达这部分代码:"\r\n".join(BigList)
,我就可以看到内存使用量的大幅增加以及相当长的时间(〜1分钟)来保存结果;
有关更好地处理此列表的任何提示或建议(减少内存使用量)并将其快速保存在硬盘上?
答案 0 :(得分:3)
加入:
"\r\n".join(BigList)
在写下来之前在内存中创建一个非常大的字符串。如果使用for循环,它的内存效率会更高:
for line in BigList:
savefile.write(line + "\r\n")
另一个问题是,为什么你首先在内存中有这么多字符串?
答案 1 :(得分:1)
for line in BigList:
savefile.write(line+'\n')
我会通过迭代来实现。
答案 2 :(得分:0)
要节省磁盘空间,您可以这样做:
from gzip impo GzipFile
with GzipFile('dump.txt', 'w') as fh:
fh.write('\r\n'.join(BigList))
(也使用with
运算符)。
将其与for
运算符组合以节省内存:
from gzip impo GzipFile
with GzipFile('dump.txt', 'w') as fh:
for item in BigList:
fh.write(str(item)+'\r\n')
要做到这一点你可以做得很快(节省内存,磁盘空间和时间):
import pickle
from gzip import GzipFile
with GzipFile('dump.pckl', 'wb') as fh:
pickle.dump(BigList, fh)
但是请注意,如果他们了解数据中的pythons pickle结构,那么这个大的列表只能被外部程序访问。 但假设您想在自己的应用程序中重用BigList,那么pickle就是您的选择。
注意到有关您阅读大文本文件以便写入其他文件的一些评论。
在这种情况下,上述方法对您有用。
如果要将内存或时间保存在两个文件上。请考虑以下内容:
with open('file_one.txt', 'rb') as inp:
with open('file_two.txt', 'wb' out:
for line in inp:
out.write(do_work(line)+b'\r\n')