2016-03-27 5 views
1

Ich habe viele (etwa 6000) Textdateien mit einer Liste von IDs in jedem (jede ID in der Datei in einer neuen Zeile). Es kann 10000 bis 10 Millionen IDs in jeder Datei geben.So erhalten Sie eine Reihe von eindeutigen Werten aus vielen Listen effizient (Python)

Wie bekomme ich eine Reihe von eindeutigen IDs aus all diesen Dateien?

Meine aktuellen Code sieht wie folgt aus:

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

Probleme mit dem aktuellen Code:

  • 1) Verbraucht zu viel RAM
  • 2) Zu langsam

Gibt es eine effizientere Möglichkeit, diese Aufgabe zu erledigen?

Ist es auch möglich, alle CPU-Kerne in dieser Aufgabe zu verwenden?

Antwort

1

Einige Gedanken:

  • die Schaffung Satz überspringen s. Nur Update die ID_set direkt.
  • Je nachdem, wie die Dateien aussehen, können Sie einfach lesen() und str.split() anstelle des CSV-Readers verwenden.

Vielleicht so etwas wie dies für Ihre Datenmenge arbeiten:

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

Vielen Dank! funktioniert jetzt viel schneller .. Aber verbraucht immer noch viel RAM ( –

0

Dieser Ansatz kann ein wenig langsamer als Raymond, aber es vermeidet sofort jede Datei in den Speicher geladen:

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()) 
Verwandte Themen