bloom filter 对象由 Python 模块 pybloom
创建。假设我有超过 1000 万个字符串等待添加到这个对象中,一般的方法是:
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
。
请原谅我糟糕的英语,如果可以的话请给我看代码。谢谢。
最佳答案
我不太熟悉 pybloom
或 BloomFilter
对象,但快速浏览一下代码就会发现您可以联合
多个BloomFilter
对象。
根据您的string_list
的大小,您可以创建一个n
的Pool
。为简单起见,假设 n=2
。这里的逻辑是:对于 string_list
中的 x
个字符串 - 将其分成 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
您必须为 divide_list_in_parts
和 concat_bf_list
添加代码。但我希望你明白逻辑。
另外,请阅读:https://docs.python.org/3.4/library/multiprocessing.html
关于python - 在 Python 中使用多处理时如何共享自定义变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54003292/