2016-09-16 4 views
1

Ich versuche, 3GB Datei in Pandas Datenrahmen mit read_csv Funktion und erhalten Fehler zu lesen: der SpeicherPandas - aus der Erinnerung

Ich bin auf dem PC mit 16 GB RAM, Ubuntu 16.04 und Pandas 0,18 Version. Ich weiß, dass ich dtype bereitstellen kann, um das Hochladen zu erleichtern, aber es gibt zu viele Spalten in meinem Datensatz und ich möchte es zuerst laden und dann über den Datentyp entscheiden.

Update: Dies ist keine doppelte Frage. 3 GB sollte leicht auf 16 GB-Maschine passen.

Ein weiteres Update: Hier ist Traceback.

Traceback (most recent call last): 
    File "/home/a/Dropbox/Programming/Python/C and d/main.com.py", line 9, in <module> 
    preprocessing() 
    File "/home/a/Dropbox/Programming/Python/C and d/main.com.py", line 5, in preprocessing 
    df = pd.read_csv(filepath_or_buffer = file_path, sep ='\t', low_memory = False) 
    File "/usr/lib/python3/dist-packages/pandas/io/parsers.py", line 498, in parser_f 
    return _read(filepath_or_buffer, kwds) 
    File "/usr/lib/python3/dist-packages/pandas/io/parsers.py", line 285, in _read 
    return parser.read() 
    File "/usr/lib/python3/dist-packages/pandas/io/parsers.py", line 747, in read 
    ret = self._engine.read(nrows) 
    File "/usr/lib/python3/dist-packages/pandas/io/parsers.py", line 1197, in read 
    data = self._reader.read(nrows) 
    File "pandas/parser.pyx", line 769, in pandas.parser.TextReader.read (pandas/parser.c:8011) 
    File "pandas/parser.pyx", line 857, in pandas.parser.TextReader._read_rows (pandas/parser.c:9140) 
    File "pandas/parser.pyx", line 1833, in pandas.parser.raise_parser_error (pandas/parser.c:22649) 
pandas.parser.CParserError: Error tokenizing data. C error: out of memory 

Leider kann ich nicht ganze Datendatei schreiben, aber es hat in etwa 2,5 mil Zeilen und meist kategorisch (string) Daten

Hoffentlich letzte Update:

Hier ist mein Original-Code zu lese daten in datenframe:

import pandas as pd 
def preprocessing(): 
    file_path = r'/home/a/Downloads/main_query.txt' 
    df = pd.read_csv(filepath_or_buffer = file_path, sep ='\t', low_memory = False) 

Der obige Code produziert Fehlermeldung, die ich oben gepostet.

ich dann low_memory = False zu entfernen versucht, und alles funktionierte, gab es nur Warnung:

sys:1: DtypeWarning: Columns (17,20,23,24,33,44,58,118,134, 
135,137,142,145,146,147) have mixed types. 
Specify dtype option on import or set low_memory=False. 
+0

Sie können versuchen, [diese Methode ] (http://stackoverflow.com/a/37845530/5741205) – MaxU

+0

@MaxU Vielen Dank für den Vorschlag. Es ist auch möglich, 'dtype' anzugeben, um den Speicherverbrauch zu reduzieren. Würden Sie bitte das doppelte Tag entfernen? Die Frage, auf die Sie sich beziehen, ist schlecht formuliert. Nirgendwo in Pandas-Dokumenten können Sie ein Limit für die Dateigröße finden, egal ob Sie 6 GB oder 600 TB groß sind, und auch genügend RAM, um damit fertig zu werden. Es könnte langsam sein, aber das ist nicht der Punkt. Zuvor gab es Bugs in Pandas mit Memory-Handling und diese wurden behoben. Dieser scheint ebenfalls ein Fehler zu sein, also braucht er die richtige Aufmerksamkeit. – user1700890

+0

könnten Sie bitte eine vollständige Fehlerrückverfolgung posten? Sicher können Sie 'dtype' verwenden, aber wir sehen Ihre Daten nicht, daher können wir Ihnen nicht die Werte für den' dtype' Parameter vorschlagen ... – MaxU

Antwort

2

UPDATE: in Pandas 0.19.0 it should be possible to specify categorical dtype when using read_csv() method:

pd.read_csv(filename, dtype={'col1': 'category'}) 

Sie können so versuchen Pandas 0,19 zu verwenden. 0 RC1

OLD Antwort:

Sie können Ihre CSV in Stücke lesen und zu der resultierenden DF auf jedem Schritt verketten:

chunksize = 10**5 
df = pd.DataFrame() 

for chunk in (pd.read_csv(filename, 
          dtype={'col1':np.int8, 'col2':np.int32, ...} 
          chunksize=chunksize) 
      ): 
    df = pd.concat([df, chunk], ignore_index=True) 

HINWEIS: Parameter dtype mit Motor = ‚Python‘ nicht unterstützt wird

Verwandte Themen