2014-02-19 11 views
5

Ich versuche, den Speicherverbrauch eines Python-Diktats zu reduzieren, das in meinem Fall als word-->document_id "invertierter Index" dient. Jede word wird als Integer Hashed, die 24 Bytes dauert.Speichern von Speicher von dict mit Bitarray anstelle von Int?

Ich frage mich, ob ich jedes Element innerhalb dict Werte und jeden Schlüssel innerhalb dict zu einem Bitarray stattdessen konvertieren kann. Ich habe festgestellt, dass der Maximalwert von int weniger als 2^22 ist, also kann ich vielleicht nur ein Bit-Array von "Größe 22" zuweisen.

Wie kann das gemacht werden? Bisher habe ich gmpy2 und bitarray Bibliotheken, sowie std::bitset in der C++ stdlib gesehen, die ich mit Cython verwenden kann. Ich habe aus dieser post gelesen, dass bitarray nicht so schnell wie gmpy ist. In gmpy bin ich mir nicht sicher, wie man die Größe einstellt. Schließlich frage ich mich, ob der Speicher-Overhead von gmpy oder bitarray Objekte in Python es wert ist, wenn ich einfach std::bitset verwenden kann, die wahrscheinlich den geringsten Speicher von allen verwendet.

Antwort

3
>>> sys.getsizeof(1) 
24 

Das ist 24 Bytes, nur für eine ganze Zahl, auf meinem Rechner. Bei Python-Objekten wird der Objekt-Overhead alle anderen Kosten für solch kleine Werte überschwemmen. Selbst wenn Sie 10 Bits abrastern könnten (was nicht möglich ist; die Speicherzuweisung funktioniert nicht so), sind es Peanuts im Vergleich zum refcount, dem Typzeiger und dem dict-Eintrag selbst (der in dieser 24 nicht enthalten ist) Nummer), noch bevor Sie zu den eigentlichen Daten gelangen.

bitarray wird nicht helfen; es ist wahrscheinlich größer als ein Int. Ich weiß nicht über std::bitset, da ich nicht sicher bin, was Overhead Cython hinzufügt, aber es wird Overhead für Dinge wie die Bitzahl haben. Wenn überhaupt, würde ich erwarten, dass ein Cython-Int am besten funktioniert, aber es muss wahrscheinlich in einen regulären Python-Int konvertiert werden, um in ein Dict zu gelangen.

+0

Ich kann 'std :: unordered_map' verwenden, um C-typisierte' unsigned int' zu speichern. Aber du sagst, es ist einfach besser, es ohne Bitarrays zu implementieren ..? – richizy

+0

@richizy: Bitarrays werden nicht helfen. Ich denke, eine "unordered_map" könnte deine beste Einstellung sein. – user2357112

+0

okay .. Ich habe nie realisiert, wie verrückt die Speicherreferenzen auf Python-Primitive sind – richizy

Verwandte Themen