ホームページ >バックエンド開発 >Python チュートリアル >Python でマルチプロセッシングのために共有メモリ内の NumPy 配列を使用するにはどうすればよいですか?

Python でマルチプロセッシングのために共有メモリ内の NumPy 配列を使用するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-06 08:08:101023ブラウズ

How Can I Use NumPy Arrays in Shared Memory for Multiprocessing in Python?

マルチプロセッシング用の共有メモリで NumPy 配列を使用する

Python でマルチプロセッシングを使用する場合、プロセス間で配列を共有するのは困難な場合があります。 NumPy 配列を単純な ctypes 配列ではなく NumPy 配列のように動作させる必要がある場合、マルチプロセッシングで NumPy 配列を使用すると、問題が発生する可能性があります。

問題ステートメント

提供された例では、NumPy 配列は ctypes Array() オブジェクトでラップされます。これにより、ctypes 方式で配列にアクセスできるようになりますが、NumPy 配列の機能は失われます。 -1*arr や arr.sum() のような操作は実行できず、NumPy 配列に変換し直すと共有メモリが破損します。

shared_arr.get_lock() を使用した解決策

共有メモリ配列の使用中に NumPy 配列の機能を保持するには、共有メモリ配列から利用可能な get_lock() メソッドを使用できます。 array:

shared_arr = mp.Array(ctypes.c_double, N)

def f(i):
    with shared_arr.get_lock():
        arr = np.frombuffer(shared_arr.get_obj())
        arr[i] = -arr[i]

get_lock() メソッドを使用すると、共有配列へのアクセスを同期し、プロセス内で NumPy 配列のように確実にアクセスできるようにします。

次のコードは、共有を利用しながら NumPy 配列の機能を保持する改良された例を提供します。 Memory:

import multiprocessing as mp
import numpy as np

N = 100
shared_arr = mp.Array(ctypes.c_double, N)
arr = np.frombuffer(shared_arr.get_obj())

# Fill the shared array with random values
arr[:] = np.random.uniform(size=N)

# Create a pool of processes
with mp.Pool(initializer=init, initargs=(shared_arr,)) as pool:

    # Define functions that modify the shared array
    def f(i):
        with shared_arr.get_lock():
            arr -= 1 # Subtract 1 from each array element within the process

    pool.map(f, range(N))

# Check the modified shared array
assert np.allclose(arr, -1)

この例では、init() 関数が各プロセスのshared_arr を設定し、f() 関数がロック内の共有配列に対して動作します。変更された共有アレイは、プールに参加した後、メイン プロセスからアクセスできるようになります。このメソッドは、マルチプロセッシングで共有配列を使用する、同期された NumPy 互換の方法を提供します。

以上がPython でマルチプロセッシングのために共有メモリ内の NumPy 配列を使用するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。