1
zarte 2019-12-26 09:57:50 +08:00
没中转放东西的地方怎么可能?
|
2
wuwukai007 2019-12-26 09:59:58 +08:00
一次读一行追加?不知道你是什么类型文件
|
3
andyfan 2019-12-26 10:03:48 +08:00 via Android
每次往内存里读一个 byte, 硬盘删掉一个 byte 再追加进去. 当然这样效率很低. 你也可以用 500M 内存空间换取时间
|
4
yinian OP |
5
yinian OP 原先的想法是 linux 下用 split 分割成很小的文件 再用 cat 连接起来 不知道可不可行
|
6
sockpuppet9527 2019-12-26 10:09:40 +08:00
裸盘的话是可以的,4k 对齐盘。4k*n+offset 直接位移过去就行,需要内存
带文件系统的话,假如 ext 系列,包括了 inode,包括了元数据,1G 的盘是存不下两个 500M 的文件的, 假如两个文件小于 500M,正好塞满,上层的 api 做不到(我的理解)。 |
7
sx90 2019-12-26 10:10:42 +08:00
还是备份出来比较好
真心要搞,自己开发程序(现有程序,基本需要缓存空间) 思路是以二进制打开 B 文件,写入内存,先删除 B 文件已写入内存的部分,将内存内容写入 A 文件末尾 不停重复,直至 B 文件为空 风险极大,因为没备份,没缓存,如果出现死机,断电,那就完了 不对,不对,没空间了,开发程序也无法复制到硬盘,此题应该无解(辛辛苦苦打了这么字,还是发出来了) |
9
wuwukai007 2019-12-26 10:16:39 +08:00
很难模拟你说的场景。。。。这是关键
|
10
yinian OP @wuwukai007 #9 emmmm
|
11
yinian OP 简单说 不占用太多内存、不占用额外磁盘空间的情况下 快速把两个 500M 的文件合并成一个
|
12
zunceng 2019-12-26 13:11:23 +08:00
不知道能不能直接修改 inode 上的数据来实现 等我玩玩 fuse 以后再来回答
|
13
zunceng 2019-12-26 15:18:19 +08:00
简单来说就是
A_inode {blocks: [block_a_0, block_a_1, ...]} B_inode {blocks: [block_b_0, block_b_1, ...]} append B_inode.blocks to A_inode.blocks remove B_inode 想玩的话 可以自己实现一个用户态的文件系统 直接啃 fs 的源码还是有点累的 https://github.com/hanwen/go-fuse |