2017-12-21 12 views
-1

私は数百万の非常に小さなファイルを含んでいるアプリケーションを扱っています。転送するのは非常に難しいです。GolangのBigfiles

私は大きなファイルを作成する可能性のあるbi​​gfilesまたは別の仮想ファイルシステムを考え、インデックスされたすべてのデータを含んでいます。

ゴーランではどうしたらいいですか?お勧めのお勧めはありますか?

答えて

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

+1

私はまた、プロジェクトのドキュメントによれば、1TBのデータセットを処理するのにかなりの "標準" [BoltDB](https://github.com/boltdb/bolt)があるように見えます。バトルテスト済みの[LevelDB](https://github.com/syndtr/goleveldb)もありますが、サイズの制限についてはわかりません。 – kostix

1

多分(たぶんゼロコンプレッション付き)シンプルなZIPアーカイブがあなたのために働くのでしょうか?内容(ファイルストリーム)に自然インデックスがあるので、open it using archive/zipの場合は、対応するファイルストリームの検索と読み取り方法を「知っている」 a slice of "file info blocks"、 に戻ります。 (ファイルのデータのオフセットを取得する方法さえありますが、 は、デコンプレッサーを使わずに直接デコンプレッサーをバイパスし、チェックサム検証 を読むことができますので、測定値が そのデータにアクセスする "通常の方法"は最適ではありません)。

高速アクセスのためにファイル名でインデックス付けされたマップを作成できます。

さらに、「自然」のディレクトリツリーをシミュレートするために、このようなマップの階層を作成してください。 ファイルシステムツリーに複数のZIPアーカイブがあるかもしれません。


そして、あなたが持っているしたいと思い、すべてがファイルストリームの塊+インデックスのR/Oブロブであれば、当然、それは読み取りと書き込みのために自分自身-の両方を実装するために合理的に簡単なものになるでしょう。あなたがものを設計するのにあまり慣れていないなら、私はformat of the Git "pack files"を見るでしょう。

+0

私は、zipアーカイブに_millions_個のファイルを追加することの効率に疑問を抱いています。誰かがテストの下に置くべきです... – icza

+0

@icza、確かに、それも私の疑いでした。 Buは、ファイルが「非常に小さい」と明示していたので、私は自然にそれらがKiB未満のように小さく、4GBの「標準ZIP」モジュールに収まるかもしれないと仮定しました。 – kostix