To, co sugerujesz, nie jest bezpośrednio wykonalne. Ponieważ nowe procesy mogą być uruchamiane w górę i w dół poza twoją kontrolą, nie ma możliwości przechowywania natywnych danych Pythona w pamięci.
Istnieje jednak kilka sposobów na obejście tego.
Często wystarczy jeden poziom pamięci klucz-wartość. A czasami posiadanie buforów o stałym rozmiarze dla wartości (których można użyć bezpośrednio jako str
/bytes
/bytearray
przedmioty; wszystko, czego potrzebujesz do struct
tam lub w inny sposób serializować) to wszystko, czego potrzebujesz. W takim przypadku wbudowana struktura buforowania uWSGI zadba o wszystko, czego potrzebujesz.
Jeśli potrzebujesz bardziej precyzyjnej kontroli, możesz zobaczyć, jak pamięć podręczna jest zaimplementowana na wierzchu SharedArea
i zrób coś dostosuj. Jednak nie polecałbym tego. Zasadniczo zapewnia ten sam rodzaj interfejsu API, jaki otrzymujesz z plikiem, a jedyną realną przewagą nad samym używaniem pliku jest to, że serwer będzie zarządzać czasem życia pliku; działa we wszystkich obsługiwanych przez uWSGI językach, nawet tych, które nie zezwalają na pliki; i ułatwia migrację niestandardowej pamięci podręcznej do rozproszonej (wielokomputerowej) pamięci podręcznej, jeśli zajdzie taka potrzeba. Nie sądzę, aby którekolwiek z nich było dla Ciebie istotne.
Innym sposobem na uzyskanie płaskiej pamięci klucz-wartość, ale bez buforów o stałym rozmiarze, jest użycie biblioteki standardowej Pythona anydbm
. Wyszukiwanie klucz-wartość jest tak pythoniczne, jak to tylko możliwe:wygląda jak dict
, z tą różnicą, że kopia zapasowa jest tworzona w bazie danych BDB na dysku (lub podobnej), buforowana odpowiednio w pamięci, zamiast być przechowywana w tablicy mieszającej w pamięci.
Jeśli potrzebujesz obsłużyć kilka innych prostych typów — wszystko, co jest niesamowicie szybkie do usunięcia/marynowania, takie jak int
s — warto rozważyć shelve
.
Jeśli Twoja struktura jest wystarczająco sztywna, możesz użyć bazy danych klucz-wartość dla najwyższego poziomu, ale uzyskaj dostęp do wartości za pomocą ctypes.Structure
lub de/serializuj za pomocą struct
. Ale zazwyczaj, jeśli możesz to zrobić, możesz również wyeliminować najwyższy poziom, w którym to momencie cała twoja sprawa jest tylko jedną wielką Structure
lub Array
.
W tym momencie możesz po prostu użyć zwykłego pliku do przechowywania — albo mmap
to (dla ctypes
) lub po prostu open
i read
to (dla struct
).
Lub użyj multiprocessing
Udostępnione ctypes
Obiekty z dostępem do Twojej Structure
bezpośrednio z obszaru pamięci współdzielonej.
Tymczasem, jeśli faktycznie nie potrzebujesz wszystkich danych z pamięci podręcznej przez cały czas, tylko bitów i kawałków od czasu do czasu, właśnie do tego służą bazy danych. Ponownie, anydbm
, itp. może być wszystkim, czego potrzebujesz, ale jeśli masz złożoną strukturę, narysuj diagram ER, przekształć go w zestaw tabel i użyj czegoś takiego jak MySQL.