【问题标题】:In PyArrow, how to append rows of a table to a memory mapped file?在 PyArrow 中,如何将表的行附加到内存映射文件?
【发布时间】:2021-03-12 07:46:50
【问题描述】:

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

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)

我收到一个异常,指出内存映射文件未关闭: ValueError: I/O operation on closed file.

有什么建议吗?

【问题讨论】:

    标签: python memory-mapped-files pyarrow memory-mapping apache-arrow


    【解决方案1】:

    您的直接问题是您使用的是pa.MemoryMappedFile(path, 'w') 而不是pa.memory_map(path, 'w')。后者定义为...

    _check_is_file(path)
    cdef MemoryMappedFile mmap = MemoryMappedFile()
    mmap._open(path, mode)
    return mmap
    

    ...所以关闭的原因应该很清楚了。

    您将遇到的下一个问题(假设它不是复制/粘贴到 SO 中的错误)是您正在编写 table 而不是 updated_table。轻松修复。

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

    OSError: Write out of bounds (offset = ..., size = ...) in file of size ...
    

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

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

    【讨论】:

      猜你喜欢
      • 2011-05-26
      • 2010-12-28
      • 1970-01-01
      • 2014-02-19
      • 2021-04-26
      • 2023-03-08
      • 1970-01-01
      • 2023-04-06
      相关资源
      最近更新 更多