迭代数百万行的文件

时间:2014-04-05 17:30:12

标签: python loops large-files

我正在尝试遍历一个文件,其中有数百万行包含一些数据,而我正在检索它。不幸的是,这种情况非常缓慢,我想知道如何才能提高效率。 目前我正在加载两个文件,我按每行迭代。

代码:

# Retrieve session data
UBList = array([line.split('\t') for line in source])
SID = set(UBList[:,1])
n_unique_sessions = len(Counter(UBList[:,1]))
source.close()
sessions = {}
session_info = {}
purchases = array([line.split('\t') for line in open('Data/order_overview.txt', 'r').readlines()])

for sid in SID:
    print sid
    s = [line for line in UBList if line[1]==sid]
    uline = [line for line in s if line[3]=='17']
    tline = [line[2] for line in s]
    t_format = "%Y-%m-%d %H:%M:%S.%f"
    s_start = datetime.strptime(tline[0], t_format)
    s_end = datetime.strptime(tline[-1], t_format)
    s_length = (s_end - s_start).total_seconds()
    d_time = [line[2] for line in s if line[3]=='4']
    if len(uline) > 0: 
        uid = uline[0][12]
    else: 
        uid = 'NotFound'
    num_queries = len([line for line in s if line[3]=='27'])
    num_purchases = nonzero(purchases[:,0]==sid)[0].shape[0]
    sessions.update({sid: (uid, num_queries, num_purchases, s)})
    f = open('Results/' + sid + '_' + uid + '_' + str(num_queries) + '_' + str(num_purchases) + '_' + str(s_length) + '.txt', 'w')
    f.writelines(['\t'.join(line) for line in s])
    f.close()

这样的事情会加速吗?

somevar = dict([sid, [] for sid in SID])
for line in UBList:
sid = line[1]
dSID[sid].append('\t'.join(line))

也可以在达到某个标准后获得下一行吗?例如,我发现一行用下一行得到它的值并进行计算。如果多次找到符合条件的行,则添加结果。

1 个答案:

答案 0 :(得分:0)

如果source是您的文件对象,请不要事先将其全部读取到内存中。您可以同时处理它并读取,并且Python足够聪明地处理数据,同时等待下一个块被读取。要实现这一点,请使用列表生成器,而不是列表推导。

您创建了许多实际上并不需要的数组,例如s。用发电机替换它们并获得加速。创建标准Python数组是一项繁重的操作,如果它大于4kB,则生成器应该更好。