Python)如何减少大数据集解析的运行时间

时间:2013-11-02 07:18:53

标签: python parsing

我将阅读,解析并整合两个巨大的文本文件作为输入,然后创建新文件。
还有另外一个用于此解析的文件。
简要说明,两个文本文件有大约1亿行和3列。
首先,读取两个不同的文件,并将匹配的两个值写入新文件。
如果输入文件中没有匹配值,则将0.0插入每行的矩阵中。
为了提高解析效率,我从两个文本文件中创建了另一个输入文件,即第一列(键)的联合文件,如下所示。我用小输入文件(10000行)测试了这段代码。它运作良好。两天前我开始使用巨大的数据集运行此代码,不幸的是它仍在运行。
如何减少运行时间并有效解析?

1st_infile.txt

MARCH2_MARCH2   2.3 0.1
MARCH2_MARC2    -0.2     0
MARCH2_MARCH5   -0.3    0.3
MARCH2_MARCH6   -1.4    0
MARCH2_MARCH7   0.1 0
MARCH2_SEPT2    -1.0    0
MARCH2_SEPT4    0.8 0

2nd_infile.txt

MARCH2_MARCH2    2.2    0
MARCH2_MARCH2.1  0.2    0
MARCH2_MARCH3   -0.4    0
MARCH2_MARCH5   -0.3    0
MARCH2_MARCH6   -0.6    0
MARCH2_MARCH7    1.2    0
MARCH2_SEPT2     0.2    0

union_file.txt

MARCH2_MARCH2   
MARCH2_MARCH2.1
MARCH2_MARC2
MARCH2_MARCH5   
MARCH2_MARCH6   
MARCH2_MARCH7
MARCH2_SEPT2    
MARCH2_SEPT4
MARCH2_MARCH3

Outfile.txt

MARCH2_MARCH2   2.3   0.1   2.2     0
MARCH2_MARCH2.1     0.0   0.0   0.2     0
MARCH2_MARC2       -0.2   0     0.0     0.0
MARCH2_MARCH5      -0.3   0.3   -0.3    0
MARCH2_MARCH6      -1.4   0     -0.6    0
MARCH2_MARCH7       1.2   0     1.2     0
MARCH2_SEPT2       -1.0   0     0.2     0
MARCH2_SEPT4        0.8   0     0.0     0.0
MARCH2_MARCH3       0.0   0.0  -0.4     0

Python.py

def load(filename):
    ret = {}
    with open(filename) as f:
        for lineno, line in enumerate(f, 1):
            try:
                name, value1, value2 = line.split()
            except ValueError:
                print('Skip invalid line {}:{}L {0!r}'.format(filename, lineno, line))
                continue
            ret[name] = value1, value2
    return ret

a, b = load('1st_infile.txt'), load('2nd_infile.txt')

with  open ('Union_file.txt') as f:
        with  open('Outfile.txt', 'w') as fout: 
            for line in f:
                    name = line.strip()
                    fout.write('{0:<20} {1[0]:>5} {1[1]:>5} {2[0]:>5} {2[1]:>5}\n'.format(
                            name,
                            a.get(name, (0, 0)),
                            b.get(name, (0, 0))
                    )) 

2 个答案:

答案 0 :(得分:0)

您应该尝试使用流式读取而不是一次读取整个文件。 (懒读)

你可以在这里找到一个懒惰读者的工作示例: Lazy Method for Reading Big File in Python?

答案 1 :(得分:0)

因为1st_infile.txt和2nd_infile.txt高度相关,为什么不尝试一起解析这两个文件,并使用singal result_dict存储所有信息而不是两个dict? 脚本就像:

 result_dict={}
 f1=open(1st..)
 f2=open(2st..)
 line1=f1.readline()
 line2=f2.readline()
 while (...):
   name1,val11 , val12 = line1.split()
   result_dict.setdefault(name1,[0.]*4)[0],result_dict.\
   setdefault(name1,[0.]*4)[1] =val11,val12
   name2, val21, val22 = line1.split()
   result_dict.setdefault(name2,[0.]*4)[2],result_dict.\
   setdefault(name2,[0.]*4)[3] =val21,val22
   line1=f1.readline()
   line2=f2.readline()
   ....
 ....
 f1.close()
 f2.close()

注意:这只是一个简短的插图,而不是可运行的代码。

从大文件中读取行有多种方法:   1. for line in file:dosth   2. file.next()使用迭代生成器(不推荐)   3. file.readline()或file.readlines(1000),每次读取1000行。 你也可以从文件中读取字节,就像懒惰方法

一样