大佬们给点意见 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
yinian
V2EX    程序员

大佬们给点意见

  •  
  •   yinian
    yinian0406 2019-12-26 09:50:44 +08:00 3302 次点击
    这是一个创建于 2184 天前的主题,其中的信息可能已经有所发展或是发生改变。
    有没有这种可能???: 磁盘空间共 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     Solana     3724 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 00:55 PVG 08:55 LAX 16:55 JFK 19:55
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86