Saya mencoba memparalelkan serangkaian perhitungan yang menggunakan bigfloat. Namun, ada kesalahan

Error sending result: '[BigFloat.exact('1.0000000', precision=20)]'. Reason: 'TypeError('self._value cannot be converted to a Python object for pickling')'

Saya MWE untuk mereproduksi kesalahannya adalah

from bigfloat import *
from multiprocessing import Pool

def f(x,a,b,N):
    with precision(20):
        X=BigFloat(x)
        for i in range(N):
            X = a*X*X-b
        return X

if __name__ == '__main__':
    pool = Pool(processes=2)
    out1,out2 = pool.starmap(f,[(1,2,1,3),(2,2,2,2)])

(fungsi itu sendiri tidak penting sama sekali). Jika saya tidak menggunakan bigfloat, maka semuanya baik-baik saja. Jadi, ini pasti semacam interaksi antara multiprocessing dan bigfloat.

Jadi, saya membayangkan multiprocessing mengalami masalah saat menyimpan objek BigFloat. Saya sepertinya tidak bisa "mengekstrak" hanya nilai yang dilemparkan oleh BigFloat. Bagaimana cara mengatasi masalah ini?

0
PepeToro 15 Mei 2020, 13:31

1 menjawab

Jawaban Terbaik

Rupanya bigfloat tidak mendukung pengawetan, saya mendapatkan kesalahan yang sama saat melakukan pickle.dumps(BigFloat(1))

https://github.com/mdickinson/bigfloat/issues/106 mencatat ini sebagai perlu dilakukan

Sebagai solusi, mengapa tidak mengonversi ke string saat mentransfer antar proses? yaitu ubah f menjadi return str(X) dan kemudian minta rutinitas lain mengurai string menjadi BigFloat sesuai kebutuhan

Jika tidak, Anda dapat menulis beberapa kode untuk mendukung ini dan mengirimkannya ke proyek

1
Sam Mason 15 Mei 2020, 11:16