V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yinian
V2EX  ›  程序员

大佬们给点意见

  •  
  •   yinian ·
    yinian0406 · 2019-12-26 09:50:44 +08:00 · 2864 次点击
    这是一个创建于 1801 天前的主题,其中的信息可能已经有所发展或是发生改变。
    有没有这种可能???: 磁盘空间共 1G 存了两个文件 a\b 都是 500M 内存空间 1M 怎样将 B 追加到 A 的尾部,然后把 B 删掉。最终 1G 的空间里剩下个 1G 的 A 文件
    第 1 条附言  ·  2019-12-26 12:38:55 +08:00
    简单说 不占用太多内存、不占用额外磁盘空间的情况下 快速把两个 500M 的文件合并成一个
    13 条回复    2019-12-26 15:18:19 +08:00
    zarte
        1
    zarte  
       2019-12-26 09:57:50 +08:00
    没中转放东西的地方怎么可能?
    wuwukai007
        2
    wuwukai007  
       2019-12-26 09:59:58 +08:00
    一次读一行追加?不知道你是什么类型文件
    andyfan
        3
    andyfan  
       2019-12-26 10:03:48 +08:00 via Android
    每次往内存里读一个 byte, 硬盘删掉一个 byte 再追加进去. 当然这样效率很低. 你也可以用 500M 内存空间换取时间
    yinian
        4
    yinian  
    OP
       2019-12-26 10:05:52 +08:00
    @zarte #1 1M 内存空间是个切入点
    @wuwukai007 #2 具体没说 可以理解为 txt 也行
    yinian
        5
    yinian  
    OP
       2019-12-26 10:07:31 +08:00
    原先的想法是 linux 下用 split 分割成很小的文件 再用 cat 连接起来 不知道可不可行
    sockpuppet9527
        6
    sockpuppet9527  
       2019-12-26 10:09:40 +08:00
    裸盘的话是可以的,4k 对齐盘。4k*n+offset 直接位移过去就行,需要内存
    带文件系统的话,假如 ext 系列,包括了 inode,包括了元数据,1G 的盘是存不下两个 500M 的文件的,
    假如两个文件小于 500M,正好塞满,上层的 api 做不到(我的理解)。
    sx90
        7
    sx90  
       2019-12-26 10:10:42 +08:00
    还是备份出来比较好

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

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

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

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

    不对,不对,没空间了,开发程序也无法复制到硬盘,此题应该无解(辛辛苦苦打了这么字,还是发出来了)
    yinian
        8
    yinian  
    OP
       2019-12-26 10:15:57 +08:00
    @sx90 #7 有想法都是好的
    wuwukai007
        9
    wuwukai007  
       2019-12-26 10:16:39 +08:00
    很难模拟你说的场景。。。。这是关键
    yinian
        10
    yinian  
    OP
       2019-12-26 10:44:06 +08:00
    @wuwukai007 #9 emmmm
    yinian
        11
    yinian  
    OP
       2019-12-26 12:13:34 +08:00 via iPhone
    简单说 不占用太多内存、不占用额外磁盘空间的情况下 快速把两个 500M 的文件合并成一个
    zunceng
        12
    zunceng  
       2019-12-26 13:11:23 +08:00
    不知道能不能直接修改 inode 上的数据来实现 等我玩玩 fuse 以后再来回答
    zunceng
        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
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1021 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 19:52 · PVG 03:52 · LAX 11:52 · JFK 14:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.