Как описано, я не могу передать большой кадр данных в подпроцесс при использовании многопроцессорной обработки стандартной библиотеки Python или библиотеки concurrent.futures.
Версия Python: 3.11. 8
система: windows 11 23H2
Ошибка: утвердить лево > 0. Ошибка ОС: неверный параметр.
Вот пример код:
import pandas as pd
import numpy as np
def calc_sth(big_df):
result = [1]
print("start subprocess")
return result
def multi_call():
big_df = pd.DataFrame(np.random.rand(1000000,1000))
result_list = []
with ProcessPoolExecutor() as executor:
with tqdm(total=10) as pbar:
for i in range(5):
future = executor.submit(calc_sth, big_df)
future.add_done_callback(lambda p: pbar.update(1))
result_list.append(future)
res = []
for r in result_list:
res.append(r.result())
return res
if __name__ == '__main__':
res = multi_call()
print(res)
Traceback (most recent call last):
Traceback (most recent call last):
File "d:\python\Lib\multiprocessing\queues.py", line 246, in _feed
send_bytes(obj)
File "d:\python\Lib\multiprocessing\connection.py", line 200, in send_bytes
self._send_bytes(m[offset:offset + size])
File "d:\python\Lib\multiprocessing\connection.py", line 289, in _send_bytes
ov, err = _winapi.WriteFile(self._handle, buf, overlapped=True)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
OSError: [WinError 87] 参数错误。
File "d:\python\Lib\multiprocessing\process.py", line 314, in _bootstrap
self.run()
File "d:\python\Lib\multiprocessing\process.py", line 108, in run
self._target(*self._args, **self._kwargs)
File "d:\python\Lib\concurrent\futures\process.py", line 249, in _process_worker
call_item = call_queue.get(block=True)
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "d:\python\Lib\multiprocessing\queues.py", line 103, in get
res = self._recv_bytes()
^^^^^^^^^^^^^^^^^^
File "d:\python\Lib\multiprocessing\connection.py", line 216, in recv_bytes
buf = self._recv_bytes(maxlength)
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "d:\python\Lib\multiprocessing\connection.py", line 334, in _recv_bytes
return self._get_more_data(ov, maxsize)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "d:\python\Lib\multiprocessing\connection.py", line 353, in _get_more_data
assert left > 0
^^^^^^^^
AssertionError
10%|████████████████████▊ | 1/10 [00:06
Подробнее здесь: [url]https://stackoverflow.com/questions/79209823/python-multiprocessing-raise-assert-error-when-passing-large-data-into-the-subpr[/url]
Как описано, я не могу передать большой кадр данных в подпроцесс при использовании многопроцессорной обработки стандартной библиотеки Python или библиотеки concurrent.futures. Версия Python: 3.11. 8 система: windows 11 23H2 Ошибка: утвердить лево > 0. Ошибка ОС: неверный параметр. Вот пример код: [code]import pandas as pd import numpy as np
def calc_sth(big_df): result = [1] print("start subprocess") return result
def multi_call(): big_df = pd.DataFrame(np.random.rand(1000000,1000)) result_list = [] with ProcessPoolExecutor() as executor: with tqdm(total=10) as pbar: for i in range(5): future = executor.submit(calc_sth, big_df) future.add_done_callback(lambda p: pbar.update(1)) result_list.append(future)
res = [] for r in result_list: res.append(r.result()) return res
if __name__ == '__main__': res = multi_call() print(res) [/code] а вот ошибка и обратная трассировка: [code]Traceback (most recent call last): Traceback (most recent call last): File "d:\python\Lib\multiprocessing\queues.py", line 246, in _feed send_bytes(obj) File "d:\python\Lib\multiprocessing\connection.py", line 200, in send_bytes self._send_bytes(m[offset:offset + size]) File "d:\python\Lib\multiprocessing\connection.py", line 289, in _send_bytes ov, err = _winapi.WriteFile(self._handle, buf, overlapped=True) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ OSError: [WinError 87] 参数错误。 File "d:\python\Lib\multiprocessing\process.py", line 314, in _bootstrap self.run() File "d:\python\Lib\multiprocessing\process.py", line 108, in run self._target(*self._args, **self._kwargs) File "d:\python\Lib\concurrent\futures\process.py", line 249, in _process_worker call_item = call_queue.get(block=True) ^^^^^^^^^^^^^^^^^^^^^^^^^^ File "d:\python\Lib\multiprocessing\queues.py", line 103, in get res = self._recv_bytes() ^^^^^^^^^^^^^^^^^^ File "d:\python\Lib\multiprocessing\connection.py", line 216, in recv_bytes buf = self._recv_bytes(maxlength) ^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "d:\python\Lib\multiprocessing\connection.py", line 334, in _recv_bytes return self._get_more_data(ov, maxsize) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "d:\python\Lib\multiprocessing\connection.py", line 353, in _get_more_data assert left > 0 ^^^^^^^^ AssertionError 10%|████████████████████▊ | 1/10 [00:06