从大文件(~2.5GB)读取并存储到python列表时出现MemoryError



我正在尝试使用python处理一个非常大的文件中的行。我在stackoverflow中找到了读取大文件的最佳方法,这些方法来自许多之前回答过的问题。我选择了其中一种方法,并检查了它,如下所示:

fIn = fopen(fileName,'rU')
fOut = fopen(fileName1, 'w')
while 1:
    lines = fIn.readlines(100000)
    if not lines:
        break
    for line in lines :
            fOut.write(line)

这就像魔术一样,我能够成功地从一个文件中读取行并将其写入另一个文件,并且没有遇到任何MemoryErrors。

但是我现在想做的不是将从一个文件读取的行写入另一个文件,而是将它们存储在一个列表中,然后对该列表进行进一步处理。将行存储在列表中的代码如下所示:

fIn = fopen(fileName,'rU')
fOut = fopen(fileName1, 'w')
d = []
while 1:
    lines = fIn.readlines(100000)
    if not lines:
        break
    for line in lines :
            d.append(line)

这段代码正在创建MemoryError,并且在提示符上打印的堆栈跟踪显示,在此错误之前执行的最后一行是d.p append(line)行。因此,将大量数据写入列表肯定会导致错误。这个错误是在程序运行几秒钟后产生的。因此,它能够正确地将数据写入到一定的大小,然后发现一些内存故障。

我想知道在python中存储大文件的最好方法是什么,从而不会遇到MemoryError错误。

由于处理可以逐行完成,因此最好的选择是像这样遍历文件对象

with open(fileName, 'rU') as fIn:
    for line in fIn:
        process_line(line)

并将所有处理逻辑移动到process_line函数。这将是最好的选择,因为它一次只得到一行。因此,您不会阻塞内存

最新更新