2016-03-27 11 views
1

Her birinde (her yeni dosyadaki her kimlik) bir kimlik listesi içeren birçok (yaklaşık 6000) metin dosyası var. Her dosyada 10000 ila 10 milyon ID olabilir.Birçok listeden verimli bir şekilde benzersiz değerler kümesi nasıl elde edilir (Python)

Tüm bu dosyalardan bir dizi benzersiz kimlik nasıl edinilir?

Benim geçerli kod şöyle görünür: Geçerli koduyla

import glob 
 
kk=glob.glob('C://Folder_with_all_txt_files/*') 
 
ID_set=set() 
 
for source in kk: 
 
    a=[] 
 
    csvReader = csv.reader(open(source, 'rt')) 
 
    for row in csvReader: 
 
     a.append(row) 
 
    for i in xrange(len(a)): 
 
     a[i]=a[i][0] 
 
    s=set(a) 
 
    ID_set=ID_set.union(s) 
 
    del a,s

Sorunları:

  • 1) Çok fazla RAM tüketir
  • 2) Çok yavaş

Bu görevi gerçekleştirmenin daha verimli bir yolu var mı?

Ayrıca, tüm CPU çekirdeğini bu görevde kullanmak mümkün mü?

cevap

1

Bazı düşünceler:

  • seti s oluşturulmasını atla. Sadece güncelleştirmesiID_set doğrudan.
  • Dosyaların neye benzediğine bağlı olarak, CSV okuyucudan ziyade read() ve str.split() kullanabilirsiniz.
Belki böyle bir şey sizin veri kümesi için çalışacak

:

import glob 

id_set = set() 
for filename in glob.glob('C://Folder_with_all_txt_files/*'): 
    with open(filename) as f: 
     ids = f.read().split() 
     id_set.update(ids) 
+0

Teşekkürler! şimdi daha hızlı çalışır .. Ama yine de çok miktarda RAM tüketir ( –

0

Bu yaklaşım Raymond biraz daha yavaş olabilir, fakat bir anda belleğe her dosyanın yüklenmesini önler:

import glob 

ids = set() 
for filename in glob.glob('C://Folder_with_all_txt_files/*'): 
    with open(filename) as f: 
     for id_ in f: 
      ids.add(id_.strip()) 
İlgili konular