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

2021-08-11 08:37:15 +08:00
 James369
以前在学文件操作接口的时候遇到的,在一个大文件(比如 1GB )前面插入一点点数据,都要先把后面的大量数据往后挪开,然后再做插入操作。(很傻的接口操作)

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

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

结论是不会
dtgxx
2021-08-11 09:23:42 +08:00
@swulling #3 这个有测试过吗 我在一个 2T 的文件里头部插入一行,大约耗时 1 小时
James369
2021-08-11 09:24:44 +08:00
@swulling #3 既然如此,为何不开放高级的接口,比如指定位置插入操作。
passerbytiny
2021-08-11 09:30:04 +08:00
@dtgxx 普通文件系统应该没有能能支持 2T 文件的吧,分布式文件系统印象中保存时都是只追加。
Mithril
2021-08-11 09:35:25 +08:00
会的,除非你刚好插了一个 block 大小的内容进去。但这个你也得特殊处理,没法直接用系统的文件操作 API 。
比如你可以先把这些数据写成一个小文件,然后 cat 到原始文件前面。
也可以直接 fallocate 或者 dd
swulling
2021-08-11 09:38:41 +08:00
@James369 操作系统默认的接口都没有开放,需要用底层文件系统的接口
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
2021-08-11 10:26:59 +08:00
哪个符合 posix 规范的文件系统还支持中间插入的?标准文件系统语义压根就没有插入这个概念呀

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/794982

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX