2017-01-11 5 views
2

enter image description here Ich habe einige sehr große TXT Fils (ca. 1,5 GB), die ich in Python als Array laden möchte. Das Problem ist in diesen Daten ein Komma wird als Dezimaltrennzeichen verwendet. für kleinere fils habe ich diese lösung gefunden:Python: Lade Daten mit Komma als Dezimaltrennzeichen

import numpy as np 
data= np.loadtxt(file, dtype=np.str, delimiter='\t', skiprows=1) 
     data = np.char.replace(data, ',', '.') 
     data = np.char.replace(data, '\'', '') 
     data = np.char.replace(data, 'b', '').astype(np.float64) 

Aber für die großen fils läuft Python in einen Memory Error. Gibt es eine andere speichereffiziente Möglichkeit, diese Daten zu laden?

+0

Schau dir die Gebietsschemaeinstellungen an: http://Stackoverflow.com/a/19208247/3377691 – VBB

+0

kannst du einen Auszug von Beispieldaten von deiner Akte zur Verfügung stellen? Ist alles nur in einer Zeile? –

+0

Überprüfen Sie diese Frage/Antwort: http://stackoverflow.com/questions/8956832/python-out-of-memory-on-large-csv-file-numpy/8964779#8964779 –

Antwort

0

Das Problem mit np. loadtxt (Datei, dtype = np.str, delimiter = '\ t', skiprows = 1) verwendet Python-Objekte (Strings) anstelle von float64, was sehr ineffizient ist. Sie können Pandas verwenden read_table

http://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_table.html#pandas.read_table

Ihre Datei und legen Sie dezimal lesen = ‚‘ das Standardverhalten zu ändern. Dies ermöglicht das nahtlose Lesen und Konvertieren von Strings in Floats. Nach dem Laden des Pandas Datenrahmens benutze df.values, um ein numpy Array zu erhalten. Wenn es immer noch zu groß für Ihre Speichernutzung Brocken

http://pandas.pydata.org/pandas-docs/stable/io.html#io-chunking

Wenn noch kein Glück versuchen np.float32 Format, das weiterhin Hälften Speicherbedarf.

0

Sie sollten versuchen, es selbst zu analysieren, Iteration für jede Zeile (so implizit mit einem Generator, der nicht die gesamte Datei im Speicher liest). Auch für Daten dieser Größe würde ich Python-Standard array-Bibliothek verwenden, die ähnlichen Speicher wie ein c Array verwendet. Das heißt, ein Wert neben dem anderen im Speicher (numpy Array ist auch sehr effizient in Speicherauslastung obwohl).

import array 

def convert(s): 
    # The function that converts the string to float 
    s = s.strip().replace(',', '.') 
    return float(s) 

data = array.array('d') #an array of type double (float of 64 bits) 

with open(filename, 'r') as f: 
    for l in f: 
     strnumbers = l.split('\t') 
     data.extend((convert(s) for s in strnumbers if s!='')) 
     #A generator expression here. 

Ich bin sicher, ähnlichen Code (mit ähnlichem Speicherbedarf) kann geschrieben werden, ersetzen die array.array durch numpy.array, besonders, wenn Sie eine zweidimensionale Anordnung haben müssen.

Verwandte Themen