我试图将一个非常大的文本文件(~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位