V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
James369
V2EX  ›  问与答

现在大文件前面插入少量数据,是否还会导致大量数据块的移动?

  •  
  •   James369 · 2021-08-11 08:37:15 +08:00 · 1591 次点击
    这是一个创建于 995 天前的主题,其中的信息可能已经有所发展或是发生改变。
    以前在学文件操作接口的时候遇到的,在一个大文件(比如 1GB )前面插入一点点数据,都要先把后面的大量数据往后挪开,然后再做插入操作。(很傻的接口操作)

    这么多年过去了,是否依然如此?

    那么在一些大型文件编辑处理的时候(比如影音编辑、图像处理等),怎么解决这个问题?
    10 条回复    2021-08-11 10:26:59 +08:00
    ipwx
        1
    ipwx  
       2021-08-11 09:09:35 +08:00 via iPhone
    会。再创建一个文件
    jetyang
        2
    jetyang  
       2021-08-11 09:19:21 +08:00
    解决了记得通知我
    swulling
        3
    swulling  
       2021-08-11 09:20:30 +08:00 via iPhone
    这个是文件系统实现,目前主流的文件系统都没有这么傻。

    结论是不会
    dtgxx
        4
    dtgxx  
       2021-08-11 09:23:42 +08:00
    @swulling #3 这个有测试过吗 我在一个 2T 的文件里头部插入一行,大约耗时 1 小时
    James369
        5
    James369  
    OP
       2021-08-11 09:24:44 +08:00
    @swulling #3 既然如此,为何不开放高级的接口,比如指定位置插入操作。
    passerbytiny
        6
    passerbytiny  
       2021-08-11 09:30:04 +08:00 via Android
    @dtgxx 普通文件系统应该没有能能支持 2T 文件的吧,分布式文件系统印象中保存时都是只追加。
    Mithril
        7
    Mithril  
       2021-08-11 09:35:25 +08:00   ❤️ 1
    会的,除非你刚好插了一个 block 大小的内容进去。但这个你也得特殊处理,没法直接用系统的文件操作 API 。
    比如你可以先把这些数据写成一个小文件,然后 cat 到原始文件前面。
    也可以直接 fallocate 或者 dd
    swulling
        8
    swulling  
       2021-08-11 09:38:41 +08:00 via iPhone
    @James369 操作系统默认的接口都没有开放,需要用底层文件系统的接口
    myd
        9
    myd  
       2021-08-11 09:52:08 +08:00
    刚刚试了一下,在文件开头插入一样确实很慢,但在文件结尾追加很快:
    ```
    [root@VM-0-8-centos file_test]# ls -lh
    total 4.8G
    -rw-r--r-- 1 root root 4.8G Aug 11 09:39 big.txt
    [root@VM-0-8-centos file_test]# head -n 2 big.txt
    Hello World !!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    Hello World !!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    [root@VM-0-8-centos file_test]# time sed -i '1 i\add first line' big.txt

    real 2m12.840s
    user 0m32.787s
    sys 1m39.221s
    [root@VM-0-8-centos file_test]# head -n 2 big.txt
    add first line
    Hello World !!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    ```

    建议:实际存储时把文件切割,比如 20M 一个。读取的时候再拼接。
    dynastysea
        10
    dynastysea  
       2021-08-11 10:26:59 +08:00
    哪个符合 posix 规范的文件系统还支持中间插入的?标准文件系统语义压根就没有插入这个概念呀
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2187 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 04:31 · PVG 12:31 · LAX 21:31 · JFK 00:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.