python-处理非常大的文件(>;90GB)
我需要处理两个非常大的文件(>90GB)。只有一小部分文件对我很重要。我想扫描这些文件并将必要的行写入另一个文件,所以我不需要每次运行实验时都处理这么大的文件。每行大约1000个字符 我使用以下代码:python-处理非常大的文件(>;90GB),python,file,buffer,Python,File,Buffer,我需要处理两个非常大的文件(>90GB)。只有一小部分文件对我很重要。我想扫描这些文件并将必要的行写入另一个文件,所以我不需要每次运行实验时都处理这么大的文件。每行大约1000个字符 我使用以下代码: def readFile(inputFile, outputFile): startDate = datetime.datetime.strptime('10/06/2010 00:00:00', '%m/%d/%Y %H:%M:%S') endDate = datetime.da
def readFile(inputFile, outputFile):
startDate = datetime.datetime.strptime('10/06/2010 00:00:00', '%m/%d/%Y %H:%M:%S')
endDate = datetime.datetime.strptime('10/13/2010 23:59:59', '%m/%d/%Y %H:%M:%S')
total_lines = 0
with open(inputFile, 'r') as a_file:
for a_line in a_file:
total_lines += 1
id, date, content = splitLine(a_line)
datetime_object = datetime.datetime.strptime(date, '%m/%d/%Y %H:%M:%S')
if (datetime_object > startDate and datetime_object < endDate):
appendToFile(outputFile, a_line)
return total_lines
def splitLine(long_string):
values = long_string.split(",")
return values[0],values[1],values[2]
def appendToFile(outputFile, outputString):
try:
file = open(outputFile, 'a+')
file.write(outputString)
file.close()
except Exception as ex:
print("Error writing to file: " + outputFile)
return
def readFile(输入文件、输出文件):
startDate=datetime.datetime.StrTime('2010年6月10日00:00:00','%m/%d/%Y%H:%m:%S')
endDate=datetime.datetime.strtime('2010年10月13日23:59:59','%m/%d/%Y%H:%m:%S')
总行数=0
将open(inputFile,'r')作为_文件:
对于\u文件中的\u行:
总行数+=1
id、日期、内容=分割线(a_线)
datetime_object=datetime.datetime.StrTime(日期,“%m/%d/%Y%H:%m:%S”)
如果(日期时间对象>开始日期,日期时间对象<结束日期):
appendToFile(输出文件,一行)
返回总行数
def拆分行(长字符串):
值=长字符串。拆分(“,”)
返回值[0],值[1],值[2]
def appendToFile(输出文件,输出字符串):
尝试:
文件=打开(输出文件“a+”)
file.write(输出字符串)
file.close()文件
例外情况除外,例如:
打印(“写入文件时出错:“+outputFile”)
返回
问题是,每次我运行脚本时,进程都会停滞在第10.000.000行左右。当我使用htop
命令时,我可以看到Python在卡住时只使用了大约8GB的RAM,使用的虚拟内存不断增加,然后操作系统在一段时间后终止了进程
我使用了不同的文件,还有Python 2.7和3.5。我还尝试使用带有open(inputFile'r',16777216)的来使用缓冲,但结果没有改变。我在macOS Sierra 10.12.4上运行代码,机器有16GBs的RAM
有什么想法吗 将文件分块打开,直到找到所需内容。像这样:
f = open('yourfile')
piece = f.read(4096)
while piece:
# Implementation for each piece
piece = f.read(4096)
f.close()
一种更有效的方法是从python调用Unix awk命令。这在Mac和unix上都适用
您可以从python中调用unix命令,如下所示:
import os
os.popen('ls -l > result.txt')
运行此示例代码将创建一个名为result.txt的文件,其中包含ls-l命令的输出
类似地,您可以使用awk扫描您的文件,并将结果传输到另一个文件
从awk的手册页:
awk
名字
模式定向扫描和处理语言
概要
awk [ -F fs ] [ -v var=value ] [ 'prog' | -f progfile ] [ file ... ]
说明:
Awk扫描每个输入文件,查找与prog或一个或多个指定为-f progfile的文件中按字面意思指定的一组模式中的任何模式匹配的行。对于每个模式,当文件的一行与该模式匹配时,将执行一个关联的操作。每一行都是匹配的
针对每个模式操作语句的模式部分;对每个匹配的模式执行关联操作。文件名-表示标准输入。任何形式为var=value的文件都被视为赋值,而不是文件名,如果它是文件名,则在打开时执行。选项-v后跟var=value是在执行prog之前要完成的赋值;可能存在任意数量的-v选项。-F fs选项将输入字段分隔符定义为正则表达式fs
阅读此答案,了解如何使用awk读取两个日期之间的日志文件。appendToFile()做什么?您应该包括一个完整的示例,其中包括重现问题所需的所有代码(“”)。不要在注释中发布代码,您可以修改您的问题;-)@吸烟者编辑:)