2

IPython.parallel マップを使用しようとしています。並列化したい関数への入力はジェネレーターです。サイズ/メモリのため、ジェネレーターをリストに変換することはできません。以下のコードを参照してください。

from itertools import product
from IPython.parallel import Client

c = Client()
v = c[:]
c.ids

def stringcount(longstring, substrings):
    scount = [longstring.count(s) for s in substrings]
    return scount

substrings = product('abc', repeat=2)
longstring = product('abc', repeat=3)

# This is what I want to do in parallel
# I should be 'for longs in longstring' I use range() because it can get long.
for num in range(10): 
    longs = longstring.next()
    subs = substrings.next()
    print(subs, longs)
    count = stringcount(longs, subs)
    print(count)

# This does not work, and I understand why.
# I don't know how to fix it while keeping longstring and substrings as
# generators  
v.map(stringcount, longstring, substrings)

for r in v:
    print(r.get())
4

2 に答える 2

2

私はあなたの問題に対して、他の人に役立つかもしれない少し異なるアプローチを取りました. multiprocessing.pool.Pool.imap以下では、ラッピングによってメソッドの動作を模倣しようとしましたIPython.parallel.map。これにより、関数を少し書き直す必要がありました。

import IPython
from itertools import product


def stringcount((longstring, substrings)):
    scount = [longstring.count(s) for s in substrings]
    return (longstring, substrings, scount)

def gen_pairs(long_string, sub_strings):
    for l in long_string:
        s = sub_strings.next()
        yield (l, s)

def imap(function, generator, view, preprocessor=iter, chunksize=256):
    num_cores = len(view.client.ids)
    queue = []
    for i, n in enumerate(preprocessor(generator)):
        queue.append(n)
        if not i % (chunksize * num_cores):
            for result in view.map(function, queue):
                yield result
            queue = []
    for result in view.map(function, queue):
        yield result


client = IPython.parallel.Client()
lbview = client.load_balanced_view()

longstring = product('abc', repeat=3)
substrings = product('abc', repeat=2)

for result in imap(stringcount, gen_pairs(longstring, substrings), lbview):
    print result

私が見ている出力は、このノートブックにあります: http://nbviewer.ipython.org/gist/driscoll/b8de4bf980de1ad890de

于 2014-11-11T21:42:17.543 に答える