大佬们给点意见

2019-12-26 09:50:44 +08:00
 yinian
有没有这种可能???: 磁盘空间共 1G 存了两个文件 a\b 都是 500M 内存空间 1M 怎样将 B 追加到 A 的尾部,然后把 B 删掉。最终 1G 的空间里剩下个 1G 的 A 文件
2666 次点击
所在节点    程序员
13 条回复
zarte
2019-12-26 09:57:50 +08:00
没中转放东西的地方怎么可能?
wuwukai007
2019-12-26 09:59:58 +08:00
一次读一行追加?不知道你是什么类型文件
andyfan
2019-12-26 10:03:48 +08:00
每次往内存里读一个 byte, 硬盘删掉一个 byte 再追加进去. 当然这样效率很低. 你也可以用 500M 内存空间换取时间
yinian
2019-12-26 10:05:52 +08:00
@zarte #1 1M 内存空间是个切入点
@wuwukai007 #2 具体没说 可以理解为 txt 也行
yinian
2019-12-26 10:07:31 +08:00
原先的想法是 linux 下用 split 分割成很小的文件 再用 cat 连接起来 不知道可不可行
sockpuppet9527
2019-12-26 10:09:40 +08:00
裸盘的话是可以的,4k 对齐盘。4k*n+offset 直接位移过去就行,需要内存
带文件系统的话,假如 ext 系列,包括了 inode,包括了元数据,1G 的盘是存不下两个 500M 的文件的,
假如两个文件小于 500M,正好塞满,上层的 api 做不到(我的理解)。
sx90
2019-12-26 10:10:42 +08:00
还是备份出来比较好

真心要搞,自己开发程序(现有程序,基本需要缓存空间)

思路是以二进制打开 B 文件,写入内存,先删除 B 文件已写入内存的部分,将内存内容写入 A 文件末尾

不停重复,直至 B 文件为空

风险极大,因为没备份,没缓存,如果出现死机,断电,那就完了

不对,不对,没空间了,开发程序也无法复制到硬盘,此题应该无解(辛辛苦苦打了这么字,还是发出来了)
yinian
2019-12-26 10:15:57 +08:00
@sx90 #7 有想法都是好的
wuwukai007
2019-12-26 10:16:39 +08:00
很难模拟你说的场景。。。。这是关键
yinian
2019-12-26 10:44:06 +08:00
@wuwukai007 #9 emmmm
yinian
2019-12-26 12:13:34 +08:00
简单说 不占用太多内存、不占用额外磁盘空间的情况下 快速把两个 500M 的文件合并成一个
zunceng
2019-12-26 13:11:23 +08:00
不知道能不能直接修改 inode 上的数据来实现 等我玩玩 fuse 以后再来回答
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

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

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

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

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

© 2021 V2EX