python:将列表保存到具有性能的文件中

时间:2014-06-03 07:44:47

标签: python

假设我们有一个很大的字符串列表,如果我将它保存为普通文本文件(单独一行中的每个元素),它的大小将为1GB;

目前我使用此代码保存列表:

savefile = codecs.open("BigList.txt", "w", "utf-8")
savefile.write("\r\n".join(BigList));
savefile.close()

一旦我们到达这部分代码:"\r\n".join(BigList),我就可以看到内存使用量的大幅增加以及相当长的时间(〜1分钟)来保存结果;

有关更好地处理此列表的任何提示或建议(减少内存使用量)并将其快速保存在硬盘上?

3 个答案:

答案 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')