我正在使用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()
2条答案
按热度按时间btqmn9zl1#
我也遇到过同样的问题。经过一番挖掘,我发现了一些线索:
从上面的代码中可以看到,一旦我们从共享内存的
buf
创建了pa.py_buffer
对象,shm.buf
就不能被释放了。删除py_buffer
对象后,可以成功释放它,而不会抛出BufferError
异常。所以我想出来的解决我的问题的方案如下:
这可能不是一个完美的解决方案。如果有人想出更好的,请贴出来。
还要注意,当我们从多个进程读取共享内存时,
BufferError
似乎仍然会出现。我还在努力。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