在Golang Bigfiles

问题描述 投票:-1回答:2

我正在处理一个包含数百万个非常小的文件的应用程序,它变得很痛苦。转移非常困难。

所以,我想到了bigfiles或另一个可以创建一个大文件的虚拟文件系统,其中包含我索引的所有数据。

怎么会在golang中解决这个问题?你有推荐的lib吗?

go bigdata
2个回答
1
投票

也许一个简单的ZIP存档(假设零压缩)对你有用吗?它有一个内容(文件流)的自然索引,所以当你open it using archive/zip,你得到回a slice of "file info blocks",每个“知道”如何定位和读取其相应的文件流。 (甚至有一种方法可以获得文件数据的偏移量,并直接读取它 - 绕过无操作“解压缩器”和校验和验证,因此如果您的测量值显示访问该数据的速度,您可以探索这种可能的速度调整“正常的方式”将不是最理想的。)

然后,您可以创建一个由文件名索引的映射,以便快速访问。

或者可以更进一步,创建这种地图的层次结构,以模拟“自然”目录树。或者在文件系统树中可能有多个ZIP存档。


当然,如果您想拥有的所有内容都是文件流blob +索引的r / o blob,那么在阅读和编写时,这将是一个相当简单的实现自己的事情。如果你没有太多的设计东西,我会看看format of the Git "pack files"


1
投票

建议的解决方案取决于您未发布的要求,例如您是否需要修改文件?你需要能够删除它们吗?你需要分布式存储吗?

如果您只需要添加您不打算更改的新文件,您可以使用github.com/icza/kvcache(披露:我是作者)。 kvcache仅将所有条目存储在2个文件中(1个用于索引,1个用于存储数据),并将索引保​​存在内存中,因此查找速度尽可能快,传输文件仅相当于复制2个文件。

MongoDB有GridFS,它为您提供类似文件系统的API,并允许您存储文件的元数据并搜索它们。 mgo库也支持访问和使用GridFS,请参阅mgo.GridFSmgo.GridFile类型。

您也可以选择将文件存储在云端,有无数的服务和Go客户端库,所有这些都提供基本的搜索功能。

另外请务必在ServerFault上查看此问题+答案:

Storing a million images in the filesystem

© www.soinside.com 2019 - 2024. All rights reserved.