2017-12-21 9 views
-1

Ich habe es mit einer Anwendung zu tun, die Millionen von sehr kleinen Dateien enthält, und es wird zum Schmerz. Es ist sehr schwer zu übertragen.Bigfiles in Golang

Also, ich dachte an bigfiles oder ein anderes virtuelles Dateisystem, das eine große Datei erstellen könnte, die alle meine indizierten Daten enthält.

Wie würde man in Golang darüber gehen? Hast du irgendeine Empfehlung zu empfehlen?

Antwort

1

Die empfohlene Lösung hängt von Ihren nicht hochgeladenen Anforderungen ab, wie müssen Sie die Dateien ändern? Brauchen Sie die Fähigkeit, sie zu entfernen? Benötigen Sie verteilten Speicher usw.?

Wenn Sie nur neue Dateien hinzufügen müssen, die Sie nicht ändern möchten, verwenden Sie bitte github.com/icza/kvcache (Offenlegung: Ich bin der Autor). kvcache speichert alle Einträge nur in 2 Dateien (1 für den Index und 1 für die Daten) und behält den Index ebenfalls im Speicher, so dass Suchvorgänge so schnell wie möglich sind und die Übertragung der Dateien dem Kopieren von nur 2 Dateien entspricht.

MongoDB verfügt über GridFS, die Ihnen eine Dateisystem-ähnliche API bietet und es Ihnen ermöglicht, Metadaten für Dateien zu speichern und sie zu durchsuchen. Die Bibliothek mgo unterstützt auch den Zugriff und die Verwendung des GridFS, siehe die Typen mgo.GridFS und mgo.GridFile.

Sie können Ihre Dateien auch in der Cloud speichern, es gibt unzählige Dienste und Go-Client-Bibliotheken, die alle grundlegende Suchfunktionen bieten.

Auch sicher sein, diese Frage + Antwort auf ServerFault zu überprüfen:

Storing a million images in the filesystem

+1

Ich würde auch bemerken, dass so ziemlich "Standard" [BoltDB] (https://github.com/boltdb/bolt) scheint, um 1 TB Datensätze zu behandeln - entsprechend den Dokumenten des Projekts. Es gibt auch einen kampferprobten [LevelDB] (https://github.com/syndtr/goleveldb), aber ich bin mir nicht sicher über seine Größenbeschränkungen. – kostix

1

Vielleicht ein einfaches ZIP-Archiv (angeblich mit Null-Kompression) würde für Sie arbeiten? Es hat einen natürlichen Index in den Inhalt (Dateiströme), wenn Sie also , open it using archive/zip bekommen, von denen jeder "weiß", wie man seinen entsprechenden Dateistrom findet und liest. (Es gibt sogar eine Möglichkeit, den Offset der Daten der Datei zu erhalten, und lesen Sie direkt-Bypass eine no-op "Dekompressor" und Prüfsumme Verifizierung, , so dass Sie diese mögliche Geschwindigkeit Tweak erkunden könnten, wenn Ihre Messungen die Geschwindigkeit zeigen würde der Zugriff auf diese Daten "der normale Weg" wird suboptimal sein.)

Sie könnten dann eine Karte mit Dateinamen für den schnellen Zugriff erstellen.

Oder vielleicht gehen Sie weiter und erstellen Sie eine Hierarchie solcher Karten , um einen "natürlichen" Verzeichnisbaum zu simulieren. Oder vielleicht mehrere ZIP-Archive in einem Dateisystembaum.


Und natürlich, wenn alles, was man ein r/o Klecks Datei-Stream-Blobs haben wollen würde + Index, das wäre eine ziemlich einfache Sache sein, sich-sowohl zu implementieren zum Lesen und Schreiben. Wenn Sie nicht zu viel in Sachen Design sind, würde ich mir die format of the Git "pack files" ansehen.

+0

Ich habe Zweifel über die Effizienz des Hinzufügens von _millions_ von Dateien in ein Zip-Archiv. Jemand sollte es unter Tests stellen ... – icza

+0

@icza, sicher, das waren meine Zweifel auch. Da das OP explizit erwähnte, dass die Dateien "sehr klein" seien, nahm ich natürlich an, dass sie klein sind, wie zum Beispiel weniger als ein KiB, und das könnte in ein 4-GB-Standard-ZIP-Modul passen - oder auch nicht. – kostix