将大文件拆分成小文件会在python中引发内存错误

时间:2014-11-26 08:23:47

标签: python file python-3.x memory-management

我试图将一个非常大的文本文件(~8Gb)拆分成每个1Gb的小文件。但是当我尝试使用zip_longest获取块时,它会抛出内存错误。它会引发错误,如下所述:

Traceback (most recent call last):
File "splitFile.py", line 125, in <module>
    splitFileIntoChunk(lineNumFileChunk, baseDirectoryPath, inputFile);
File "splitFile.py", line 63, in splitFileIntoChunk
    for i, g in enumerate(group):
MemoryError

相同的代码适用于800Mb文件。

此外,8Gb文件已成功转换为每个大小为512Mb的文件块。但是显示错误以创建大小为1Gb的文件块。

这是否与向python编译器最大化RAM分配有关。如果是这样,我们怎么能改变它?

为了记录我的系统有16GB的RAM和i7处理器。 RAM也没有被完全消耗,因为我通过资源监视器检查它,它使用大约2-4 Gb的RAM。

以下是refence的一些代码:

def grouper(n, inputFileInterable, fillvalue=None):
    "Collect data into fixed-length chunks or blocks"
    # grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx
    args = [iter(inputFileInterable)] * n
    return zip_longest(fillvalue=fillvalue, *args)  

然后:

def  splitFileIntoChunk(lineCountChunkSize, absoluteFilePath, inputFileName):

    _fileName, _fileExtention = os.path.splitext(inputFileName);

    if not os.path.exists(absoluteFilePath + outputDirectory):
        os.makedirs(absoluteFilePath + outputDirectory)

    with open(absoluteFilePath + inputFileName) as inputFileObject:
        group = grouper(lineCountChunkSize, inputFileObject, fillvalue=None);
        for i, g in enumerate(group):
            with tempfile.NamedTemporaryFile('w', delete=False) as fout:
                for j, line in enumerate(g, 1):  # count number of lines in group
                    if line is None:
                        j -= 1  # don't count this line
                        break
                    fout.write(line)
            os.rename(fout.name, (absoluteFilePath + outputDirectory + _fileName + '_{0}' + _fileExtention).format(i))

如需更多参考代码,请参阅:Splitting large text file into smaller text files by line numbers using Python

版本:Python 3.4
操作系统:Windows 7
架构:64位

0 个答案:

没有答案