4

私は非常に基本的な質問をしているかもしれませんが、Python で単純な並列アプリケーションを作成する方法が本当にわかりません。16 コアのマシンでスクリプトを実行していますが、それらすべてを効率的に使用したいと考えています。16 個の巨大なファイルを読み取る必要があり、各 CPU に 1 つのファイルを読み取らせ、結果をマージさせたいと考えています。ここで、私がやりたいことの簡単な例を示します。

  parameter1_glob=[]
  parameter2_glob[]


  do cpu in arange(0,16):
      parameter1,parameter2=loadtxt('file'+str(cpu)+'.dat',unpack=True)

      parameter1_glob.append(parameter1)
      parameter2_glob.append(parameter2)

モジュールが役立つと思いますが、multiprocessingやりたいことに適用する方法がわかりませんでした。

4

3 に答える 3

2

Colin Dunklau が彼のコメントで言ったことに同意します。このプロセスはこれらのファイルの読み取りと書き込みでボトルネックになり、CPU の要求は最小限です。17 台の専用ドライブがあったとしても、コアが 1 つも使い果たされることはありません。さらに、これはあなたの実際の質問に接していることは理解していますが、これらの「巨大な」ファイルでメモリ制限に遭遇する可能性があります.16個のファイルを配列としてメモリにロードし、それらを別のファイルに結合すると、ほぼ確実にあなたが持っている。

この問題をシェル スクリプトで調べると、より良い結果が得られる場合があります。特に、GNUsortはメモリ効率の良いマージソートを使用して、1 つまたは複数のファイルを非常に高速にソートします。Python や他のほとんどの言語で最も慎重に作成されたアプリケーション以外のすべてのアプリケーションよりもはるかに高速です。

あらゆる種類のマルチスレッド作業を回避することをお勧めします。これにより、複雑さが劇的に増し、メリットは最小限に抑えられます。一度にメモリに保持するファイルはできるだけ少なくしてください。そうしないと、すぐに不足してしまいます。いずれにせよ、読み取りと書き込みを 2 つの別々のディスクで実行することが絶対に必要です。同じディスクへの読み取りと書き込みを同時に行うことによる速度低下は、非常に苦痛です。

于 2012-07-26T15:30:50.063 に答える
1

行ごとにマージしますか? コルーチンは、I/O バウンドのアプリケーションにとって、従来のマルチタスクよりも興味深い場合があります。あらゆる種類のルーティング、マージ、およびブロードキャストのために、ジェネレーターとコルーチンをチェーンできます。David Beazley によるこの素敵なプレゼンテーションであなたの心を吹き飛ばしてください。

コルーチンをシンクとして使用できます (テストされていません。dabeaz の例を参照してください)。

# A sink that just prints the lines
@coroutine
def printer():
    while True:
        line = (yield)
        print line,

sources = [
    open('file1'),
    open('file2'),
    open('file3'),
    open('file4'),
    open('file5'),
    open('file6'),
    open('file7'),
]

output = printer()
while sources:
    for source in sources:
        line = source.next()
        if not line: # EOF
            sources.remove(source)
            source.close()
            continue
        output.send(line)
于 2012-07-26T15:55:21.870 に答える
0

各ファイルの結果が小さいと仮定すると、私のパッケージjugでこれを行うことができます:

from jug import TaskGenerator
loadtxt = TaskGenerator(loadtxt)

parameter1_glob=[]
parameter2_glob[]

@TaskGenerator
def write_parameter(oname, ps):
    with open(oname, 'w') as output:
        for p in ps:
            print >>output, p

parameter1_glob = []
parameter2_glob = []

for cpu in arange(0,16):
    ps = loadtxt('file'+str(cpu)+'.dat',unpack=True)
    parameter1_glob.append(ps[0])
    parameter2_glob.append(ps[1])

write_parameter('output1.txt', parameter1_glob)
write_parameter('output2.txt', parameter2_glob)

jug executeこれで、複数のジョブを実行できます。

于 2012-09-12T15:11:55.300 に答える