【发布时间】:2014-03-18 13:14:48
【问题描述】:
- 我有一个 300m 行的文件 (inputFile),所有文件都有 2 列,由制表符分隔。
- 我还有一个包含 1000 个唯一项目 (vals) 的列表。
我想为 inputFile 中第一列出现在 vals 中的所有行创建一个字典,其中第 1 列作为键,第 2 列作为值。 vals 中的一些项目不会出现在文件中,这些值必须保存在新列表中。我最多可以使用 20 个线程来加快这个过程。
实现这一目标的最快方法是什么?
到目前为止我最好的尝试:
newDict = {}
foundVals = []
cmd = "grep \"" + vals[0]
for val in vals:
cmd = cmd + "\|^"+val+"[[:space:]]"
cmd = cmd + "\" " + self.inputFile
p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
for line in iter(p.stdout.readline, ''):
info = line.split()
foundVals.append(info[0])
newDict.update({info[0]:info[1]})
p.wait()
notFound = [x for x in vals if x not in set(foundVals)]
示例 输入文件:
2 9913
3 9913
4 9646
...
594592886 32630
594592888 32630
594592890 32630
值:
[1,2,594592888]
想要的字典:
{2:9913,594592888:32630}
并且在未找到:
[1]
【问题讨论】:
-
您能否提供输入文件的样本和所需的输出?只是为了说清楚。
-
也许可以尝试使用 python 的 open(file, r) 命令,看看是否能提高性能。
-
@sshashank124 这是我的第一次尝试,但这种方法要快得多......
-
@jeanrjc 添加了一个示例
-
@MarkRansom 正在写这个!谢谢@Jetse:关键点是,如果你包含
val[0]而没有锚和空格字符类,你可能会得到一个错误的命中。