私は数百万の非常に小さなファイルを含んでいるアプリケーションを扱っています。転送するのは非常に難しいです。GolangのBigfiles
私は大きなファイルを作成する可能性のあるbigfilesまたは別の仮想ファイルシステムを考え、インデックスされたすべてのデータを含んでいます。
ゴーランではどうしたらいいですか?お勧めのお勧めはありますか?
私は数百万の非常に小さなファイルを含んでいるアプリケーションを扱っています。転送するのは非常に難しいです。GolangのBigfiles
私は大きなファイルを作成する可能性のあるbigfilesまたは別の仮想ファイルシステムを考え、インデックスされたすべてのデータを含んでいます。
ゴーランではどうしたらいいですか?お勧めのお勧めはありますか?
推奨される解決策は、未修正の要件(ファイルを変更する必要がありますか?それらを削除する必要がありますか?分散ストレージなどが必要ですか?
変更したくない新しいファイルを追加する必要がある場合は、github.com/icza/kvcache
(開示:私は著者です)を使用してください。 kvcache
は、すべてのエントリを2つのファイルにのみ格納します(インデックス用に1つ、データ用に1つ)。インデックスはメモリにも保存されるので、検索はできるだけ高速になり、ファイルを転送することは2つのファイルのみをコピーすることに相当します。
MongoDBにはGridFSがあり、ファイルシステムのようなAPIを提供し、ファイルのメタデータを保存して検索することができます。 mgo
ライブラリは、GridFSへのアクセスと使用もサポートしています。mgo.GridFS
とmgo.GridFile
のタイプを参照してください。
また、クラウドにファイルを保存することもできます。無数のサービスとGoクライアントライブラリがあり、すべて基本的な検索機能を提供します。
また、この質問+ ServerFaultの上で答えを確認してください:
多分(たぶんゼロコンプレッション付き)シンプルなZIPアーカイブがあなたのために働くのでしょうか?内容(ファイルストリーム)に自然インデックスがあるので、open it using archive/zip
の場合は、対応するファイルストリームの検索と読み取り方法を「知っている」 a slice of "file info blocks"、 に戻ります。 (ファイルのデータのオフセットを取得する方法さえありますが、 は、デコンプレッサーを使わずに直接デコンプレッサーをバイパスし、チェックサム検証 を読むことができますので、測定値が そのデータにアクセスする "通常の方法"は最適ではありません)。
高速アクセスのためにファイル名でインデックス付けされたマップを作成できます。
さらに、「自然」のディレクトリツリーをシミュレートするために、このようなマップの階層を作成してください。 ファイルシステムツリーに複数のZIPアーカイブがあるかもしれません。
そして、あなたが持っているしたいと思い、すべてがファイルストリームの塊+インデックスのR/Oブロブであれば、当然、それは読み取りと書き込みのために自分自身-の両方を実装するために合理的に簡単なものになるでしょう。あなたがものを設計するのにあまり慣れていないなら、私はformat of the Git "pack files"を見るでしょう。
私はまた、プロジェクトのドキュメントによれば、1TBのデータセットを処理するのにかなりの "標準" [BoltDB](https://github.com/boltdb/bolt)があるように見えます。バトルテスト済みの[LevelDB](https://github.com/syndtr/goleveldb)もありますが、サイズの制限についてはわかりません。 – kostix