Mam 400 milionów linii unikalnej informacji o wartości kluczy, które chciałbym być dostępne do szybkiego wyszukiwania w skrypcie. Zastanawiam się, co byłby slick to robi to. Rozważałem następujące informacje, ale nie jestem pewien, czy istnieje sposób na mapę dysku Słownik i bez użycia dużej ilości pamięci, z wyjątkiem podczas tworzenia słownika.

  1. Obiekt Marynowany Słownik: Nie jestem pewien, czy jest to optymalne rozwiązanie dla mojego problemu
  2. NoSQL Type DBASES: Idealnie chcę czegoś, co ma minimalną zależność od rzeczy trzecich, a wartość kluczowa jest po prostu liczbami. Jeśli uważasz, że jest to wciąż najlepsza opcja, chciałbym też to usłyszeć. Może mnie przekonuje.

Daj mi znać, czy coś nie jest jasne.

Dzięki! -Bhi.

23
Abhi 7 sierpień 2012, 03:11

6 odpowiedzi

Najlepsza odpowiedź

Jeśli chcesz przetrwać duży słownik, w zasadzie patrząc na bazę danych.

Python jest wyposażony w wbudowany wsparcie dla SQLite3, co zapewnia łatwe rozwiązanie bazy danych cofnięty przez plik dysk.

19
Sam Mussmann 6 sierpień 2012, 23:15

Nikt nie wspomniał o DBM. Jest otwarty jak plik, zachowuje się jak słownik i jest w standardowej dystrybucji.

Z dokumentów http://docsPython.org/release/3.0. 1 / biblioteka / 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()

Spróbowałem tego przed dowolną z bardziej egzotycznych form, a za pomocą półki / marynowania wyciągnie wszystko w pamięci na ładowaniu.

Twoje zdrowie

Tim

13
orestisf 9 wrzesień 2020, 09:52

Zasadniczo SHELVE Moduł wykonuje dokładnie co chcesz. Zapewnia trwałym słowniku kopii zapasowej przez plik bazy danych. Klucze muszą być łańcuchami, ale półek zajmie się wartościami mostującymi / nielokującymi. Typ pliku dB może się różnić, ale może być a Berkeley DB Hash, który jest doskonałą wartością ligą wartością Baza danych.

Twoja wielkość danych brzmi ogromna, więc musisz wykonać pewne testowanie, ale SHELVE / BDB prawdopodobnie zależy od niego.

Uwaga: BSDDB moduł został przestarzały. Prawdopodobnie sheelve nie będzie wspierać skrótów BDB w przyszłości.

12
mhawke 7 sierpień 2012, 00:01

Bez wątpienia (moim zdaniem), jeśli chcesz się utrzymywać, to Redis jest świetną opcją.

  1. Zainstaluj serwer Redis
  2. Start Redis Server.
  3. Zainstaluj Redis Python Pacakge (instalacja PIP Redis)
  4. Zysk.

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)

Powyżej zakłada pliki wartości, takich jak:

key1=value1
key2=value2
etc=etc

Zmodyfikuj skrypt wstawienia do swoich potrzeb.


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)

Dlaczego lubię Redis.

  1. Konfigurowalne opcje trwałości.
  2. Płonący szybko
  3. Oferuje więcej niż tylko para / para wartości (inne typy danych)
  4. @antrąz
5
robert king 6 sierpień 2012, 23:32

Nie sądzę, że powinieneś spróbować marynowanego dyktatu. Jestem pewien, że python będzie slurp całą rzeczą za każdym razem, co oznacza, że twój program będzie czekać na I / O dłużej niż być może konieczne.

Jest to rodzaj problemu, dla którego dane zostały wymyślone. Myślisz, że "Nosql", ale także bazy danych SQL działał również. Powinieneś być w stanie użyć sqlite dla tego; Nigdy nie zrobiłem bazy danych SQLite, ale zgodnie z tą dyskusją na temat limitów sqlite, 400 milionów wpisów powinno być w porządku.

Jakie są charakterystyki wydajności SQLite z bardzo dużymi plikami bazy danych?

4
Community 23 maj 2017, 12:17

Osobiście używam lmdb i jego Wiązanie Pythona przez kilka milionów rekordów DB. Jest bardzo szybki nawet dla bazy danych większej niż pamięć RAM. Jest osadzony w tym procesie, więc nie jest potrzebny serwer. Zależność jest zarządzana za pomocą PIP.

Jedynym minusem jest określenie maksymalnego rozmiaru DB. LMDB zamierza mmap plik tego rozmiaru. Jeśli jest zbyt mały, wkładanie nowych danych podniesie błąd. Duży, tworzysz rzadki plik.

3
Setop 11 maj 2016, 09:17