关闭时Python多处理共享内存错误

yruzcnhs  于 2023-06-25  发布在  Python
关注(0)|答案(2)|浏览(632)

我正在使用Python多处理共享内存。
尝试关闭SharedMemory对象时,我看到以下错误:BufferError:memoryview有1个导出缓冲区
有人能告诉我这个错误是什么意思吗?
以下是如何复制:我在用Pyarrow

import pyarrow as pa
import pandas as pd
import numpy as np
from multiprocessing import shared_memory

a = pd.DataFrame(np.random.normal(size=(1000,1000)))
batch = pa.RecordBatch.from_pandas(a)

mock_sink = pa.MockOutputStream()
with pa.RecordBatchStreamWriter(mock_sink, batch.schema) as stream_writer:
    stream_writer.write_batch(batch)

data_size = mock_sink.size()
print(data_size)
shm_a = shared_memory.SharedMemory(create=True, size=data_size)

buf = pa.py_buffer(shm_a.buf)
stream = pa.FixedSizeBufferWriter(buf)
with pa.RecordBatchStreamWriter(stream, batch.schema) as stream_writer:
    stream_writer.write_batch(batch)
print(shm_a.name)
shm_a.close()
btqmn9zl

btqmn9zl1#

我也遇到过同样的问题。经过一番挖掘,我发现了一些线索:

从上面的代码中可以看到,一旦我们从共享内存的buf创建了pa.py_buffer对象,shm.buf就不能被释放了。删除py_buffer对象后,可以成功释放它,而不会抛出BufferError异常。
所以我想出来的解决我的问题的方案如下:

这可能不是一个完美的解决方案。如果有人想出更好的,请贴出来。
还要注意,当我们从多个进程读取共享内存时,BufferError似乎仍然会出现。我还在努力。

jecbmhm3

jecbmhm32#

这解决了我的问题,但现在,我试图把 Dataframe 的pyarrow类型到一个共享内存,我得到这个问题了。如果您了解更多有关此问题的信息,请访问我的问题:BufferError: memoryview has 1 exported buffer trying to close a shared memory where I put a dataframe of pyarrow data type values

相关问题