2016-07-12 14 views
0

Ich denke, das ist eine sehr dumme Frage, aber ich kann nicht mehr über das Problem nachdenken.Indizierung sehr großer CSV-Dateien in Python

Ich habe eine sehr große Menge an Daten (60 + GB) im CSV-Format, das von id bestellt:

id, "{data}" 
id2, "{data}" 
... 

Ich habe eine anderen Satz von Daten, die mit diesen Daten in einem Wörterbuch-Format kombiniert werden muss (zur Zeit über einige gebeizte Dateien aufgeteilt):

{player_id: {rating, [ids]}, player_id2: {rating, [ids]}, ... } 

Wo die IDs in der cSV-Daten-IDs in den Listen oben entsprechen. Ich würde gerne die Details für jede ID in diese Daten aus den CSV-Daten einfügen, was bedeutet, dass ich eine ID nehmen, in den CSV-Daten suchen und dann in dieses Wörterbuchformat schreiben muss. Der große Engpass hier ist daher nachschlagen der Daten in den CSV-Dateien nach ID und Lesen von der Festplatte.

Meine aktuelle Lösung besteht darin, die CSV-Daten in viele kleine Dateien (1-2mb) aufzuteilen und zu indizieren, welche Dateien welche IDs enthalten, so dass die Suche nach den Daten viel schneller ist als die Analyse der gesamten CSV-Daten immer noch nicht konstant und erfordert immer noch das Öffnen einer CSV-Datei bei jedem Schritt.

Gibt es einen schnelleren Weg, dies zu tun? Ich habe das Gefühl, dass ich sehr albern bin und es gibt einen schnelleren Weg, da meine Lösung mit Multiprozessing noch zwei Wochen dauern wird.

Gerne zu klären, ob meine Frage unklar ist. Vielen Dank.

+1

Verwenden von CSV für 60 GB Daten ist keine gute Idee für genau die Gründe, die Sie hier finden. Ist es möglich, es in eine [NoSQL] (https://en.wikipedia.org/wiki/NoSQL) Datenbank zu verschieben? – Tim

+0

sind die IDs immer sequentiell? (1,2, ..., N)? und du versuchst nur einen zu finden (mit id X?) –

+0

Kann versuchen pandas pandas.pydata.org –

Antwort

0
def get_row(id): 
    with open("fname.csv") as f: 
     row = next(itertools.islice(f,id-1,id),None) 
    return row 

seine immer noch zu schmerzlich langsam sein ... Sie über die Verwendung einer Datenbank denken sollte ... oder zumindest die Speicherung der Daten als feste Breite Einträge (dh immer 37 Byte pro Zeile), wenn Sie Fileshared Fixed Width Einträge können Sie einen Offset offset = id*37;f.seek(offset);return f.read(37) berechnen und das sollte ~ ungefähr konstante Zeit sein ...

+0

Gibt es einen bestimmten Typ von Datenbank mit Python API, die schnelle Zugriffszeit hat? Der größte Engpass ist definitiv I/O sogar mit konstantem Nachschlagen. – ddnm

+0

unter der Annahme, dass Sie gegen ein indiziertes Feld abfragen, sollte es fast konstante Lookup-Zeit sein ... und Zugriffszeit ... in so ziemlich jedem SQL ... Im weniger mit Nosql aber ich verstehe, Nosql ist leicht für die Suche parallelisiert –

Verwandte Themen