请教下 v 站各位大佬一个关于删除二进制文件中一部分数据的问题(能不能行都不知道)

2023-11-15 09:13:22 +08:00
 AboPlus

​ 现在的场景是,在创建完对象后会产生一个二进制文件,相当于有多少对象就会有多少个二进制文件,二进制文件存储在云端,前端要根据这个二进制文件来进行模型的渲染,在删除对象的时候,会把云端的二进制文件同步进行删除,同时释放用户的存储空间。

​ 现在是如果对象比较多的情况下,比如有一千个对象,那么相当于云端存储着一千个这样的二进制文件,那么从前端向云端对象存储获取数据的话相当于需要获取一千次才能拿到完整的数据,前端同事觉得请求会特别多。

​ 然后领导就提了个这样的需求,他希望把所有对象产生的二进制文件放在一个二进制文件中,这个情况如果不涉及到删除倒还好说,但是涉及到删除的话,应该是没有办法删除二进制文件中的一个片段吧?包括后续继续创建对象,要把这个对象产生的数据追加到这个总的二进制文件中,那么在删除某个对象的时候岂不是要是别出这个对象在这个总的二进制文件中的位置,然后重写一份总的二进制文件把除了那个要删除的对象以外的所有数据都写进来,同时每个对象还需要一些额外的属性用来标识它们在二进制文件中的位置,在产生新的文件后,还要把后续所有对象的这个属性都修改为新的位置。如果被删除的对象所处位置在总二进制文件的前面,那相当于对几乎所有对象都要进行修改。

​ 我目前觉得这个需求有点难搞,从我的视角来看,带来的问题远比能解决的问题多得多,甚至并不能解决原有的问题,对此想请教下各位大佬,对于这种情况各位有什么看法,可以分别从前端视角和后端视角给一些看法和建议。

1865 次点击
所在节点    程序员
27 条回复
0TSH60F7J2rVkg8t
2023-11-15 11:44:15 +08:00
有云端对象存储,就不要合并一个 bin 文件啊,一个文件,你修改删除全是问题,怎么恢复合并又是问题。实际上,你只需要在数据库里保留所有二进制文件的云端位置,和文件信息,读取的时候从数据库拉,删除的时候,数据库软删除,前端不操作对象存储,服务器跑个定时任务,把软删除的数据库条目读出来,去云端对象存储里删除释放空间 就行了。
okakuyang
2023-11-15 13:26:09 +08:00
建议同一项目的模型文件用 zip 压缩成一个或者多个。

估计你单个模型体积挺小的,这时候要考虑到云端存储规则有没有隐形一条,最小文件实体的大小。比如你单个文件体积小于 2.5MB ,但是云存储依旧按照 2.5MB 收费。

如果没有立即删除文件的需求的可以只在数据库里标记删除。

前端获取文件的时候用分片下载,虽然逻辑会写的麻烦一点,但是能够有效减少云存储的访问次数,可以省点钱。
hanyu2pomelo
2023-11-15 13:28:56 +08:00
用 mmap 可以解决吧
AboPlus
2023-11-15 14:03:31 +08:00
@sofukwird 直接操作压缩包,删除压缩包内的文件吗?好像是个好方法,那么剩下的就是解决如何处理云端压缩包中的文件的问题了!谢谢大佬!
AboPlus
2023-11-15 14:05:51 +08:00
@tool2d 意思是存在两份数据,一份数据是一个个的小文件,一份数据是将小文件合并后的大文件,是这个意思吗,然后任何一个小文件变动,都是需要重新 md5 出来一份新的大文件,是这样吗
AboPlus
2023-11-15 14:07:59 +08:00
@chnwillliu 数据量不太好估计,因为可能不止 1000 个模型
aecra
2023-11-15 14:09:07 +08:00
请求多没啥问题,开 HTTP2 就看带宽多大了,你这修改一下就改大文件是因为带宽比请求数量廉价吗?小文件还能使用缓存呢

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

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

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

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

© 2021 V2EX