Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python-处理非常大的文件(>;90GB)_Python_File_Buffer - Fatal编程技术网

python-处理非常大的文件(>;90GB)

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

我需要处理两个非常大的文件(>90GB)。只有一小部分文件对我很重要。我想扫描这些文件并将必要的行写入另一个文件,所以我不需要每次运行实验时都处理这么大的文件。每行大约1000个字符

我使用以下代码:

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()做什么?您应该包括一个完整的示例,其中包括重现问题所需的所有代码(“”)。不要在注释中发布代码,您可以修改您的问题;-)@吸烟者编辑:)