我将阅读,解析并整合两个巨大的文本文件作为输入,然后创建新文件。
还有另外一个用于此解析的文件。
简要说明,两个文本文件有大约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))
))
答案 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行。 你也可以从文件中读取字节,就像懒惰方法
一样