Speichereffizienz beim Belichten mit C struct Cython

stimmen
2

Ich bin auf der Suche Cython verwenden, um die Speicheranforderungen einer Datenstruktur zu reduzieren, die in einem Python-Wörterbuch millionenfach gespeichert. Im Moment habe ich dies als eine einfache Cython Klasse in einer Monstranz Datei implementiert:

cdef class FooBar:
    cdef public int x
    cdef public int y

    def __init__(self, x, y):
        self.x = x
        self.y = y

Ich benutze diese in einer anderen pyx Datei einen Python-Wörterbuch zu füllen, die Millionen von Schlüsseln hat:

python_dict[key] = FooBar(x, y)

Dies stellt eine erhebliche Speichereinsparungen im Vergleich zu einer namedtuple oder andere Python-Lösung als meine eigentliche Klasse speichert 6 ganzen Zahlen verwenden und benötigt somit 40 Byte Speicher (6 * 4 + 16 Bytes für PyObject_Head). Allerdings ist das 16 Byte-Overhead erheblich ist und meine Frage ist, ob es ein besserer Weg, dies zu tun. Mein Verständnis ist, dass es nicht direkt eine C-Struktur kann aussetzen, da diese Art Umwandlung in einem Python-Wörterbuch weit mehr Speicher erfordern würde. Das python_dict Wörterbuch wird ausführlich in meinem hauptsächlich Python-Code verwendet. Gibt es eine Möglichkeit, die PyObject_Head Overhead zu vermeiden, ohne dass viel von der Implementierung über die reine Cython / C bewegen?

Veröffentlicht am 27/11/2018 um 18:00
quelle vom benutzer
In anderen Sprachen...                            


1 antworten

Speichereffizienz beim Belichten mit C struct Cython

stimmen
2

Ich bin auf der Suche Cython verwenden, um die Speicheranforderungen einer Datenstruktur zu reduzieren, die in einem Python-Wörterbuch millionenfach gespeichert. Im Moment habe ich dies als eine einfache Cython Klasse in einer Monstranz Datei implementiert:

cdef class FooBar:
    cdef public int x
    cdef public int y

    def __init__(self, x, y):
        self.x = x
        self.y = y

Ich benutze diese in einer anderen pyx Datei einen Python-Wörterbuch zu füllen, die Millionen von Schlüsseln hat:

python_dict[key] = FooBar(x, y)

Dies stellt eine erhebliche Speichereinsparungen im Vergleich zu einer namedtuple oder andere Python-Lösung als meine eigentliche Klasse speichert 6 ganzen Zahlen verwenden und benötigt somit 40 Byte Speicher (6 * 4 + 16 Bytes für PyObject_Head). Allerdings ist das 16 Byte-Overhead erheblich ist und meine Frage ist, ob es ein besserer Weg, dies zu tun. Mein Verständnis ist, dass es nicht direkt eine C-Struktur kann aussetzen, da diese Art Umwandlung in einem Python-Wörterbuch weit mehr Speicher erfordern würde. Das python_dict Wörterbuch wird ausführlich in meinem hauptsächlich Python-Code verwendet. Gibt es eine Möglichkeit, die PyObject_Head Overhead zu vermeiden, ohne dass viel von der Implementierung über die reine Cython / C bewegen?

Beantwortet am 27/11/2018 um 18:00
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more