Mam bazy danych rekordów osób, które muszę załadować do pamięci, ponieważ będą miały dostęp do wielu razy w różnych zamówieniach. Do tej pory tylko instancji jednego obiektu Pythona na rekord. Ale teraz, gdy mam 8 000 000 rekordów do pracy, nie mam wystarczającej ilości pamięci do tego prostego podejścia.

W płaskim pliku każdy rekord zajmuje tylko najwyżej 500 bajtów, bez kompresji (znacznie mniej ze ściskaniem). Więc cały zestaw danych jest mniejszy niż 4 GB na dysku. Gdy każdy rekord zostanie załadowany przez Pythona jako obiekt, jednak stosuje się szacunek 40 GB pamięci RAM. Moja maszyna ma tylko 12 GB pamięci RAM.

Rozważam integrację C z moim programem Python i przechowywanie każdego rekordu jako struktury w C. Czy to brzmi jak dobre rozwiązanie? Lub jest lepszy sposób na przechowywanie zapisów kompaktowo w Pythonie, który nie wymaga połączenia z C?

Aktualizacja: Baza danych, której używam to Hbase (http://hbase.apache.org/), działa na Hadoop. Połączenie z Python dzieje się przez THIFT (http://thrift.apache.org/).

Aktualizacja 2: Muszę uzyskać dostęp do wszystkich rekordów w bazie danych w wielu różnych zamówieniach, a te zamówienia są określane w czasie wykonywania. Myślę, że na każdej iteracji mogłem zrobić 8 000 000 zapytań do bazy danych, ale myślę, że prawdopodobnie będzie dość powolny.

Aktualizacja 3: Nie sądzę, że istnieje dobry sposób na przechowywanie wierszy, tak że można je uzyskać kolejno. Kolejność, w jakiej potrzebuję rekordów w następnej iteracji (mój program jest algorytmem maszyny iteracyjnej), jest określona przez liniową projekcję algebry na określony wierszektor macierzy danych podczas poprzedniej iteracji.

2
Jeff 27 sierpień 2012, 23:09

4 odpowiedzi

Najlepsza odpowiedź

Brzmi jak numpy Strukturyzowane tablice może działać tutaj tutaj. Będzie używać dużo mniejszej pamięci niż przy użyciu obiektów Pythona i Numpy zapewnia wiele szybko i wzmacniacz; Wygodne operacje na nich. Dodatkowo tablice mogą być mapowane pamięci, które mogą być czasami użyteczne.

Niezależnie od tego, czy baza danych jest dobrą opcją (jak sugerują inne), zależy od algorytmu, a także rozmiarów danych. Istnieje wiele przypadków, w których Numpy jest lepszym rozwiązaniem (mniejsza praca, bardziej wydajna itp.).

2
Shane Evans 28 sierpień 2012, 11:03

Jest to idealny przypadek użytkowania dla bazy danych. Zamiast przechowywać wszystko w pamięci, możesz przechowywać go na dysku i zapytać, jak chcesz.

Sqllite3 jest jedną dobrą i łatwą opcją. Możesz być szczególnie zainteresowany obiektem relacyjnym Mapper (ORM), taki jak Sqlalchemy, co sprawia, że pracuje z bazami danych podobnymi do Praca z obiektami Python.

3
David Robinson 27 sierpień 2012, 19:12

Może istnieć wiele sposobów, aby poradzić sobie z tym w zależności od pożądanej wydajności i użycia przypadków, ale prawdopodobnie nie musisz mieć wszystkich danych w pamięci. Jednym z nich oczywisty sposób, aby wybrać prawdziwy silnik bazy danych, takich jak sqlite lub < href = "http://sourceforge.net/projects/mysql-Python/" Rel = "Nofollow"> {X1}} . Proste do wdrożenia, ale prawdopodobnie znacznie wolniejsze sposobu jest shelve.

0
Lev Levitsky 27 sierpień 2012, 19:15

Zgadzam się z innymi w tym wątku, że baza danych byłaby narzędziem wyboru, ale jeśli nalegasz na pamięć, ma wyszukiwarkę w http://www.memsql.com/ (choć nigdy nie pracowałem z tym)

0
schacki 27 sierpień 2012, 20:18