Python 在PyArrow中,如何将表的行附加到内存映射文件中?

Python 在PyArrow中,如何将表的行附加到内存映射文件中?,python,memory-mapped-files,pyarrow,memory-mapping,apache-arrow,Python,Memory Mapped Files,Pyarrow,Memory Mapping,Apache Arrow,正如您在下面的代码中所看到的,我在向保存在内存映射文件中的表添加新行时遇到问题。 我只想用新行再次写入文件 import pyarrow as pa source = pa.memory_map(path, 'r') table = pa.ipc.RecordBatchFileReader(source).read_all() schema = pa.ipc.RecordBatchFileReader(source).schema new_table = create_arrow_table(

正如您在下面的代码中所看到的,我在向保存在内存映射文件中的表添加新行时遇到问题。 我只想用新行再次写入文件

import pyarrow as pa

source = pa.memory_map(path, 'r')
table = pa.ipc.RecordBatchFileReader(source).read_all()
schema = pa.ipc.RecordBatchFileReader(source).schema
new_table = create_arrow_table(schema.names) #new table from pydict with same schema and random new values
updated_table = pa.concat_tables([table, new_table], promote=True)   
source.close()
with pa.MemoryMappedFile(path, 'w') as sink:
   with pa.RecordBatchFileWriter(sink, updated_table.schema) as writer:
      writer.write_table(table)
我收到一个异常,说明内存映射文件未关闭:
value错误:对关闭的文件执行I/O操作


有什么建议吗?

您当前的问题是您正在使用
pa.MemoryMappedFile(路径'w')
而不是
pa.MemoryMappedFile(路径'w')
。后者被定义为

_check_is_file(path)
cdef MemoryMappedFile mmap = MemoryMappedFile()
mmap._open(path, mode)
return mmap
…所以应该很清楚为什么它关闭了

您将遇到的下一个问题(假设它不是复制/粘贴到SO中的错误)是您正在编写
,而不是
更新的\u表
。容易修复

第三个问题更成问题。内存映射文件具有固定大小,不能像普通文件那样自然增长。如果您尝试将更新的表写入同一文件,您将看到

OSError: Write out of bounds (offset = ..., size = ...) in file of size ...
这个问题不是那么容易克服的。您可以将内存映射(
sink.resize(…)
)调整到某个“足够大”的大小,但最终会得到一个末尾有一堆0的文件,因此您需要确保在编写后将其缩小,我不确定这是否会比编写常规文件提供更好的性能

您可以写入字节对象,然后调整文件大小,然后将字节写入内存映射文件,但这会给您带来一些额外的簿记,我不知道调整文件大小对性能的影响