2016-03-26 26 views
4

Büyük (~ 14 gb) bir metin dosyası ile çalışan bir python komut dosyası var. Ben bir anahtar ve değer sözlüğü ile bitirdim, ama ben sözlüke göre sıralamayı denediğimde bir bellek hatası alıyorum.BÜYÜK sözlüğü nasıl sıralanır

Sözlüğün belleğe yüklenip sıralanamayacak kadar büyük olduğunu biliyorum, ancak bunu nasıl gerçekleştirebilirim?

+0

python hangi sürümünü kullanıyorsunuz? – amirouche

+0

Bunun ne kadar yararlı olduğunu ispatlayamıyorum, ama şu linki kontrol edin: http://stackoverflow.com/questions/14262433/large-data-work-flows-using-pandas. Amacınız için pandaları kullanabilir misiniz? ? – akash12300

+0

@amirouche python 2.7 – deltaskelta

cevap

2

Wiredtiger, leveldb, bsddb gibi sıralı bir anahtar/değer deposu kullanabilirsiniz. Hepsi özel sıralama işlevini kullanarak sıralı anahtarları destekler. leveldb kullanımı en kolay olanıdır ancak python 2.7, bsddb is included in the stdlib'u kullanırsanız.

:

from bsddb import hashopen 


db = hashopen('dict.db') 
db['020'] = 'twenty' 
db['002'] = 'two' 
db['value'] = 'value' 
db['key'] = 'key' 

print(db.keys()) 

Bu

>>> ['002', '020', 'key', 'value'] 

İşinizi sonra db kapatmak için unutma etmeyin çıkarır: yalnızca kalıcı sıralanmış sözlüğü açmak için ham hashopen işlevini kullanabilirsiniz sıralama lexicographic gerektiriyorsa

db.close() 

Hashopen konfigürasyonunun sizin ihtiyacınıza uygun olmadığı gerçeğine dikkat edin. Bu durumda, hız için basit bir API veya kablolu bağlantıya sahip olan leveldb'yi kullanmanızı tavsiye ederim.

bsddb değerle sipariş etmek için bileşik anahtar desen veya anahtar oluşturma kullanmak gerekir. Aradığınız siparişi tutan bir sözlük anahtarı oluşturmak için aşağı doğru kaynayan. Bu örnekte (bsddb anahtarı farklı olacak şekilde) orijinal dict tuşuyla (böylece küçük değerler ilk görünür) ilk özgün dict değerini paketi:

foobar 1 
abc 100 
a 500 
:
import struct 
from bsddb import hashopen 

my_dict = {'a': 500, 'abc': 100, 'foobar': 1} 

# insert 
db = hashopen('dict.db') 
for key, value in my_dict.iteritems(): 
    composite_key = struct.pack('>Q', value) + key 
    db[composite_key] = '' # value is not useful in this case but required 
db.close() 


# read 
db = hashopen('dict.db') 
for key, _ in db.iteritems(): # iterate over database 
    size = struct.calcsize('>Q') 
    # unpack 
    value, key = key[:size], key[size:] 
    value = struct.unpack('>Q', value)[0] 
    print key, value 
db.close() 

Bu

aşağıdaki verir
+0

Cool Tüm bilgiler için teşekkürler. Ben python düzenli sql yazabildiğimden beri sqlite rotası gitmeye karar verdim, bu benim için nasıl gidileceğini hemen anlayabiliyordu. Eminim bu çözümler harikadır. Beni doğru yönde gösterdiğin için teşekkürler – deltaskelta