【问题标题】:Python mmap.move()Python mmap.move()
【发布时间】:2013-04-26 20:32:45
【问题描述】:

在执行mmap.move()时,'dest'点之后的整个文件是否会被重写?

如果我有一个大文件,比如演出,我只想删除第一行(可能是 70 个字节?),我可以执行类似mmap.move(0, 70, <size - 70>) 的操作并截断末尾的最后 70 个字节如果需要文件。这样做时,整个文件(减去我覆盖的 70 个字节)是否被完全读取并写回磁盘?

如果是这样,有没有办法从文件的开头删除而不必重新编写整个内容?

【问题讨论】:

  • 从文件开头删除数据总是需要重写,没有办法。
  • @MartijnPieters 我是这么想的——只是想确保我没有遗漏一些有用的东西。

标签: python linux file-io mmap


【解决方案1】:

典型的文件系统没有“在文件开头截断”之类的功能,但您可以想象创建具有这种功能的文件格式。例如,如果你的原始文件是这样的:

ABCDEFGHIJKL

而你想删除 AB:

CDEFGHIJKL

但是你不想打乱所有的数据,所以就这样吧:

KLCDEFGHIJ

为了支持这一点,您只需要一个指向文件“开始”位置的索引,这样您就可以将其视为循环缓冲区。在这种情况下,索引将从 0 开始,删除 AB 后为 2,您将仅复制要删除的数据量(因此操作将是 O(m) 而不是 O(n),其中 m是删除的数量,n 是总大小)。

至于在哪里以及如何存储簿记信息,这取决于本机文件格式是什么,以及您使用的文件系统。根据您的需要,您甚至可以将其存储在单独的元数据系统(如数据库)中。

【讨论】:

    猜你喜欢
    • 2016-10-15
    • 2010-11-24
    • 2015-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-28
    相关资源
    最近更新 更多