读取大文件并使用多处理创建字典?(python)

读取大文件并使用多处理创建字典?(python),python,dictionary,multiprocessing,large-files,Python,Dictionary,Multiprocessing,Large Files,我有一个大文件(>=1GB),我正试图读取它,然后将其内容上传到字典中。只需一个简单的代码,一次读取一行,只需8分钟即可读取文件并填充字典。我正在使用的代码片段如下所示: with open(filename, 'r') as f: for line in f: toks = line.rstrip().split() id1 = toks[0] id2 = toks[1] start = int(toks[4])

我有一个大文件(>=1GB),我正试图读取它,然后将其内容上传到字典中。只需一个简单的代码,一次读取一行,只需8分钟即可读取文件并填充字典。我正在使用的代码片段如下所示:

with open(filename, 'r') as f:
    for line in f:
        toks = line.rstrip().split()
        id1 = toks[0]
        id2 = toks[1]
        start = int(toks[4])
        end = int(toks[5])

        if id1 not in my_dict:
            my_dict[id1] = [[start, end]]
        else:
            if [start, end] not in my_dict[id1]:
                my_dict[id1].append([start,end])

       if id2 not in my_dict:
            my_dict[id2] = [[start, end]]
        else:
            if [start, end] not in my_dict[id2]:
                my_dict[id2].append([start,end])

现在,单独运行这段代码需要很长时间,我想知道我是否可以使用多处理来加速这个过程?我研究了一些和我想做的事情很接近的材料,还有很多其他的。但是,鉴于我对这一点非常陌生,我甚至很难决定多处理是否是正确的方法。此外,在大多数与多处理相关的可用资源中,它们没有解释我们如何更新字典。我想我在什么地方读到过,共用一本字典是个坏主意。我希望我能更具体地回答我的问题,希望不会被标记为不适合这样做,但我只想加快构建词典的过程

编辑

根据@juanpa.arrivillaga的建议,我的代码如下所示:

import collections

my_dict = collections.defaultdict(set)
with open(filename, 'r') as f:
    for line in f:
        toks = line.rstrip().split()
        id1 = toks[0]
        id2 = toks[1]
        start = int(toks[4])
        end = int(toks[5])

        my_dict[id1].add((start,end))
        my_dict[id2].add((start,end))

<>这把我的时间减少到大约21秒,当运行在一个大小为~500 MB的文件中,使用11MIL行。

使用集合,而不是列表。这个检查是慢的部分,所以是的。“我想知道我是否可以使用多重处理加速这个过程?”在尝试多处理之前,你应该总是考虑你的算法。如上所述,对列表进行成员资格测试效率低下。解决这个问题first@CodeDifferent绝对不是。在Python中,
.append
是一个非摊销的常量时间操作
.append
ing在循环中是惯用的并且非常快。问题是会员资格测试。@Prameshakya,听起来不太正确。如果您不想要集合列表,那么您仍然在列表上进行成员资格测试。你到底是如何处理这些场景的?注意,您可以使用
导入集合;my_dict=defaultdict(set)
这应该尽可能快,然后您不需要进行检查,您的循环体就会变成
my_dict[id1]。添加((开始,结束));MyOxDist[ID2] .Addio((start,Enter))使用集合,而不是列表。该检查是慢的部分,所以是的。“我想知道我是否可以使用多重处理加速这个过程?”在考虑多进程之前,您应该总是考虑您的算法。如上所述,对列表进行成员资格测试效率低下。解决这个问题first@CodeDifferent绝对不是。在Python中,
.append
是一个非摊销的常量时间操作
.append
ing在循环中是惯用的并且非常快。问题是会员资格测试。@Prameshakya,听起来不太正确。如果您不想要集合列表,那么您仍然在列表上进行成员资格测试。你到底是如何处理这些场景的?注意,您可以使用
导入集合;my_dict=defaultdict(set)
这应该尽可能快,然后您不需要进行检查,您的循环体就会变成
my_dict[id1]。添加((开始,结束));my_dict[id2]。添加((开始,结束))