2012-08-06 3 views
19

Ich habe 400 Millionen Zeilen mit eindeutigen Schlüsselwerten, die ich gerne für schnelle Suchvorgänge in einem Skript zur Verfügung stellen würde. Ich frage mich, was wäre eine glatte Art, dies zu tun. Ich habe Folgendes in Betracht gezogen, bin mir aber nicht sicher, ob es eine Möglichkeit gibt, das Dictionary zuzuordnen und ohne die Verwendung von viel Speicher, außer während der Erstellung des Dictionary.* großes * Python-Wörterbuch mit Persistenzspeicher für schnelle Suchvorgänge

  1. gebeizt Wörterbuch Objekt: nicht sicher, ob dies eine optimale Lösung für mein Problem ist
  2. NoSQL Typ dbases: idealerweise etwas will, die auf fremde Sachen Mindestabhängigkeit hat und den Schlüssel-Wert sind einfach Zahlen. Wenn Sie denken, dass dies immer noch die beste Option ist, möchte ich das auch hören. Vielleicht wird es mich überzeugen.

Bitte lassen Sie mich wissen, wenn etwas nicht klar ist.

Danke! -Abhi

+15

Großes Wörterbuch mit Persistenz = Datenbank. –

+0

Ich habe gehört, dass Couch-db ist sehr nützlich für diese Art von Sache (aber nie zu verwenden ...) –

Antwort

16

Wenn Sie ein großes Wörterbuch beibehalten möchten, betrachten Sie im Grunde eine Datenbank.

Python wird mit integrierter Unterstützung für sqlite3 geliefert, die Ihnen eine einfache Datenbanklösung bietet, die von einer Datei auf der Festplatte unterstützt wird.

+0

Ich muss den Link zu den anderen SO Frage, die eine Datenbank für große Sequenzen von DNA oder etwas verwendet . –

+0

ok das wäre hilfreich – Abhi

+1

implementiert dies und funktioniert gut für die Geschwindigkeit, die wir brauchen :) – Abhi

4

Ich denke nicht, dass Sie das eingelegte Diktat versuchen sollten. Ich bin mir ziemlich sicher, dass Python die ganze Sache zu jeder Zeit schlürfen wird, was bedeutet, dass Ihr Programm länger als vielleicht notwendig auf I/O wartet.

Dies ist die Art von Problem, für das Datenbanken erfunden wurden. Sie denken "NoSQL", aber eine SQL-Datenbank würde auch funktionieren. Sie sollten in der Lage sein, SQLite dafür zu verwenden. Ich habe noch nie eine SQLite-Datenbank so groß gemacht, aber laut dieser Diskussion von SQLite-Limits sollten 400 Millionen Einträge in Ordnung sein.

What are the performance characteristics of sqlite with very large database files?

+0

Nun SQL würde funktionieren, wäre aber auch ein Overkill. – LtWorf

+1

SQLite ist nicht wirklich "übertrieben". Es gibt einen Grund, warum es von so vielen Projekten verwendet wird. – steveha

5

Ohne Zweifel (meiner Meinung nach), wenn Sie diese bestehen bleiben wollen, dann ist Redis eine gute Option.

  1. Installieren redis-Server
  2. starten redis Server
  3. redis Python pacakge (redis installieren pip) Installieren
  4. Profit.

import redis 

ds = redis.Redis(host="localhost", port=6379) 

with open("your_text_file.txt") as fh: 
    for line in fh: 
     line = line.strip() 
     k, _, v = line.partition("=") 
     ds.set(k, v) 

geht davon über ein Datei von Werten wie:

key1=value1 
key2=value2 
etc=etc 

Ändern Einfügen Skript auf Ihre Bedürfnisse.


import redis 
ds = redis.Redis(host="localhost", port=6379) 

# Do your code that needs to do look ups of keys: 
for mykey in special_key_list: 
    val = ds.get(mykey) 

Warum mag ich Redis.

  1. Konfigurierbare persistance Optionen
  2. Blazingly schnell
  3. bietet mehr als nur Schlüssel/Wert-Paare (andere Datentypen)
  4. @antrirez
+0

frage mich nur, ob Sie mit anderen Schlüssel-Wert-Speicher db gespielt haben und etwas über sie zu sagen haben..thanks – Abhi

11

Im Prinzip ist die shelve Modul macht genau das, was Sie wollen . Es bietet ein persistentes Wörterbuch, das von einer Datenbankdatei unterstützt wird. Die Schlüssel müssen Strings sein, aber das Shelve sorgt dafür, dass die Werte für Picking/Demontieren eingehalten werden. Der Typ der DB-Datei kann variieren, aber es kann ein Berkeley DB-Hash sein, was eine ausgezeichnete, leichtgewichtige Schlüsselwert-Datenbank ist.

Ihre Datengröße klingt riesig, also müssen Sie einige Tests durchführen, aber shelve/BDB ist wahrscheinlich dazu bereit.

Hinweis: Das Modul bsddb ist veraltet. Eventuell werden BDB-Hashes zukünftig nicht mehr unterstützt.

7

Niemand hat dbm erwähnt. Es wird wie eine Datei geöffnet, verhält sich wie ein Wörterbuch und ist in der Standardverteilung.

Aus dem http://docs.python.org/release/3.0.1/library/dbm.html

import dbm 

# Open database, creating it if necessary. 
db = dbm.open('cache', 'c') 

# Record some values 
db[b'hello'] = b'there' 
db['www.python.org'] = 'Python Website' 
db['www.cnn.com'] = 'Cable News Network' 

# Note that the keys are considered bytes now. 
assert db[b'www.python.org'] == b'Python Website' 
# Notice how the value is now in bytes. 
assert db['www.cnn.com'] == b'Cable News Network' 

# Loop through contents. Other dictionary methods 
# such as .keys(), .values() also work. 
for k, v in db.iteritems(): 
print(k, '\t', v) 

# Storing a non-string key or value will raise an exception (most 
# likely a TypeError). 
db['www.yahoo.com'] = 4 

# Close when done. 
db.close() 

docs Ich würde dies versuchen, bevor eine der exotischere Formen und ad acta mit/Beize wird alles in den Speicher beim Laden ziehen.

Prost

Tim

+1

In früheren Versionen von Python war dies das 'anydbm' Modul. –

2

ich persönlich LMDB und seine python binding für ein paar Millionen Datensätze DB verwenden. Es ist extrem schnell sogar für eine Datenbank größer als der RAM. Es ist in den Prozess eingebettet, so dass kein Server benötigt wird. Abhängigkeit werden mit pip verwaltet.

Der einzige Nachteil ist, dass Sie die maximale Größe der DB angeben müssen. LMDB wird eine Datei dieser Größe mappen. Wenn zu klein, verursacht das Einfügen neuer Daten einen Fehler. Zu groß erstellen Sie eine Sparse-Datei.

Verwandte Themen