• 请不要在回答技术问题时复制粘贴 AI 生成的内容
yinian
V2EX  ›  程序员

大佬们给点意见

  •  
  •   yinian ·
    yinian0406 · Dec 26, 2019 · 3578 views
    This topic created in 2358 days ago, the information mentioned may be changed or developed.
    有没有这种可能???: 磁盘空间共 1G 存了两个文件 a\b 都是 500M 内存空间 1M 怎样将 B 追加到 A 的尾部,然后把 B 删掉。最终 1G 的空间里剩下个 1G 的 A 文件
    Supplement 1  ·  Dec 26, 2019
    简单说 不占用太多内存、不占用额外磁盘空间的情况下 快速把两个 500M 的文件合并成一个
    13 replies    2019-12-26 15:18:19 +08:00
    zarte
        1
    zarte  
       Dec 26, 2019
    没中转放东西的地方怎么可能?
    wuwukai007
        2
    wuwukai007  
       Dec 26, 2019
    一次读一行追加?不知道你是什么类型文件
    andyfan
        3
    andyfan  
       Dec 26, 2019 via Android
    每次往内存里读一个 byte, 硬盘删掉一个 byte 再追加进去. 当然这样效率很低. 你也可以用 500M 内存空间换取时间
    yinian
        4
    yinian  
    OP
       Dec 26, 2019
    @zarte #1 1M 内存空间是个切入点
    @wuwukai007 #2 具体没说 可以理解为 txt 也行
    yinian
        5
    yinian  
    OP
       Dec 26, 2019
    原先的想法是 linux 下用 split 分割成很小的文件 再用 cat 连接起来 不知道可不可行
    sockpuppet9527
        6
    sockpuppet9527  
       Dec 26, 2019
    裸盘的话是可以的,4k 对齐盘。4k*n+offset 直接位移过去就行,需要内存
    带文件系统的话,假如 ext 系列,包括了 inode,包括了元数据,1G 的盘是存不下两个 500M 的文件的,
    假如两个文件小于 500M,正好塞满,上层的 api 做不到(我的理解)。
    sx90
        7
    sx90  
       Dec 26, 2019
    还是备份出来比较好

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

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

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

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

    不对,不对,没空间了,开发程序也无法复制到硬盘,此题应该无解(辛辛苦苦打了这么字,还是发出来了)
    yinian
        8
    yinian  
    OP
       Dec 26, 2019
    @sx90 #7 有想法都是好的
    wuwukai007
        9
    wuwukai007  
       Dec 26, 2019
    很难模拟你说的场景。。。。这是关键
    yinian
        10
    yinian  
    OP
       Dec 26, 2019
    @wuwukai007 #9 emmmm
    yinian
        11
    yinian  
    OP
       Dec 26, 2019 via iPhone
    简单说 不占用太多内存、不占用额外磁盘空间的情况下 快速把两个 500M 的文件合并成一个
    zunceng
        12
    zunceng  
       Dec 26, 2019
    不知道能不能直接修改 inode 上的数据来实现 等我玩玩 fuse 以后再来回答
    zunceng
        13
    zunceng  
       Dec 26, 2019
    简单来说就是
    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
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3815 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 61ms · UTC 10:23 · PVG 18:23 · LAX 03:23 · JFK 06:23
    ♥ Do have faith in what you're doing.