有一个由Python模块pybloom
创建的 bloom过滤器对象。假设我有超过一千万个字符串在等待 add 到该对象中,并且这样做的一般方法是:
from pybloom import BloomFilter
# initialize a bloomfilter object
bf = BloomFilter(int(2e7))
for i in string_list:
bf.add(i)
但是,这特别浪费了string_list
太长的时间。由于我的计算机(windows7)是4核CPU,因此我想知道是否存在一种多进程方法来充分利用CPU并快速实现add
方法。
我对multiprocessing
有所了解,但是我无法解决在进程之间交换自定义对象(例如上面的bf
)的问题。
请原谅我可怜的英语,如果可以的话,请告诉我代码。谢谢。
答案 0 :(得分:0)
我对pybloom
或BloomFilter
对象不是很熟悉,但是快速浏览一下代码可以发现您可以union
多个BloomFilter
对象。
根据您的string_list
的大小,您可以创建Pool
的{{1}}。为简单起见,请说n
。这里的逻辑是:例如,假设n=2
中的x
个字符串-将其分成大小分别为string_list
的{{1}}个列表。然后创建一个单独的过程来处理这些问题。
你可以有这样的东西:
2
x/2
的代码:
from multiprocessing import Pool
with Pool(n) as p:
bloom_filter_parts = p.map(add_str_to_bloomfilter, divide_list_in_parts(string_list))
# Now you have a list of BloomFilter objects with parts of string_list in them, concatenate them
res_bloom_filter=concat_bf_list(bloom_filter_parts)
您必须为add_str_to_bloomfilter
和def add_str_to_bloomfilter(str_list_slice):
res_bf = BloomFilter(capacity=100)
for i in str_list_slice:
res_bf.add(i)
return res_bf
添加代码。但我希望您能理解。
另外,请阅读:https://docs.python.org/3.4/library/multiprocessing.html