2010-12-31 6 views
3

Ich bin für eine Persistenz-Lösung suchen (vielleicht eine NoSQL db oder etwas anderes ...?), Die folgenden Kriterien hat:Platzsparend eingebettet Haskell Persistenz Lösung

1) Hat eine Haskell API

2) Ist Speicherplatz effizient - die db könnte leicht zu vielen Gigabyte Daten, aber ich brauche es gut auf einem typischen Desktop laufen. Ich brauche etwas, das die Daten so effizient wie möglich speichert. So wäre beispielsweise das Speichern von Feldnamen in einem Datensatz schlecht.

3) Hohe Leistung zum Lesen sequentieller Datensätze. Der typische Anwendungsfall ist irgendwo anzufangen und dann direkt durch die Daten zu lesen - möglichst schnell durch Millionen von Datensätzen zu lesen.

4) Die Daten werden grundsätzlich nie geändert (wäre nur dann geändert werden, wenn es Daten falsch war irgendwie) entdeckt wurde, protokolliert nur

5) Es sollte direkt auf Datei (en) handeln, die leicht bewegt werden kann/kopiert um. Es sollte keinen separaten laufenden Server aufrufen.

Antwort

2

Wenn Sie die Anforderung "einzelne Datei" ohne einen anderen laufenden Prozess entfernen, kann alles andere von jedem Standard-RDBMS erfüllt werden, und je nach Art der Daten, insbesondere , insbesondere, insbesondere durch Spaltenspeicher.

Die einzige Einzeldatei-Lösung, die ich kenne, ist SQLite. Hauptsächlich SQLite-Gründer, wenn auf eine einzelne Datenbank von mehreren gleichzeitigen Prozessen zugegriffen werden muss. Wenn das nicht der Fall ist, würde es mich nicht wundern, wenn Sie es deutlich skalieren könnten.

Wenn Sie nur nach sequenziellen Scans und Schlüsselwertspeichern suchen, können Sie einfach mit berkeleydb gehen, das für sehr große Datenmengen als leistungsstark bekannt ist.

Es gibt hochwertige Haskell-Bindungen für die Kommunikation mit sqlite und berkeleydb.

Bearbeiten: Nur für den sequenziellen Zugriff, ist es auch blendend einfach Ihre eigene Schicht mit den Binär-oder Getreide-Pakete rollen - Sie müssen im Grunde eine Hilfsfunktion schreiben Datensatz aus einer Datei sequenziell anstatt alle auf einmal zu wickeln. Eine Abstraktion zum Überfalten ist auch schön. Dann können Sie entscheiden, ob Sie eine Datei anhängen oder Ihre Schreibvorgänge auf Dateien verteilen möchten. So oder so, das ist die leichteste und einfachste Option von allen. Der einzige Nachteil ist, sich um die Haltbarkeit zu kümmern - sichere Schreibvorgänge bei Interrupts und all die anderen Dinge, die eine gute DB-Lösung für Sie erledigen sollte.

+0

Danke. Ich hätte angeben sollen, dass nur auf eine einzige Anwendung zugegriffen wird. Es ist für eine eingebettete Datenbank in einer Desktop-Anwendung. BerkeleyDB funktioniert nicht wegen der Lizenzierung - für den Fall, dass ich die App in Zukunft neu verteilen möchte. Ich werde in SQLite schauen – mentics

2

CouchDB tickt die meisten Ihrer Boxen:

1) http://hackage.haskell.org/package/CouchDB

2) Hängt davon ab, wie Sie es verwenden. Sie können alle binären Daten darin speichern, aber es liegt an Ihnen zu wissen, was es bedeutet. Oder Sie können XML oder JSON speichern, was weniger Platz spart, aber einfacher zu migrieren ist, wenn sich Ihr Schema weiterentwickelt (was es auch tun wird).

3) Weiß nicht, aber es ist für große Websites verwendet.

4) CouchDB verwendet ein CM-ähnliches Konzept von Updates und Baselines, so dass alte Daten erhalten bleiben. Es kann später als veraltet gelöscht werden, aber ich denke das ist optional.

5) Nein. Es ist in Erlang geschrieben und läuft (glaube ich) als ein separater Prozess. Aber warum ist das ein Problem?

+0

Erlang ist kein Problem, aber ... es ist eine eingebettete db für eine Desktop-Anwendung, und ich möchte nicht mit der Verwaltung eines laufenden Servers und dergleichen befassen. Klingt wie Couchdb funktionieren würde, außer # 5. sqlite sieht aus, als ob es die Rechnung wirklich gut passen würde, obwohl – mentics