【发布时间】:2014-05-18 00:48:18
【问题描述】:
我正在尝试遍历一个包含数百万行包含一些数据的文件,并且我正在检索它。不幸的是,这进展得很慢,我想知道如何让它更有效率。 目前我正在加载两个文件,并且每行都在迭代。
代码:
# 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))
还可以在满足特定条件后获取下一行吗?例如,我发现一条线用下一条获取它的值并进行计算。如果多次找到符合条件的行,则添加结果。
【问题讨论】:
-
我觉得这个问题更适合codereview.stackexchange.com
-
是啊,我试试你说的缓存UBList,用csvreader(docs.python.org/2/library/csv.html)读取文件,说明你的分隔符是制表符(\t) 例子有点让我理解那里发生的事情并提供更明确的答案很复杂。
-
我认为
array是numpy模块中的函数。你能描述一下source中的行的结构吗?我认为您在使用 numpy 对象时存在几个错误 -
@eyquem 源代码中的每一行都是制表符分隔的字符串。所以每行都像 abc [tab] def [tab] 123 [tab] 456 等等。 BorrajaX:所以不是存储 UBList 而是逐行读取?我是否应该将数据存储在 csv 文件中?我当前的数据在一个 txt 文件中。
-
array是不是numpy.array方法?如果不是,我不会理解UBList[:,1]中带有逗号的文字
标签: python loops large-files