2016-11-17 18 views
7

Zgaduję, że to łatwa poprawka, ale mam problem, który zajmuje prawie godzinę, aby zapisać ramkę danych pandy do pliku csv za pomocą to_csv() Funkcja. Używam anakonda python 2.7.12 z pandami (0.19.1).Pandy to_csv() spowalniają zapisywanie dużej ramki danych

import os 
import glob 
import pandas as pd 

src_files = glob.glob(os.path.join('/my/path', "*.csv.gz")) 

# 1 - Takes 2 min to read 20m records from 30 files 
for file_ in sorted(src_files): 
    stage = pd.DataFrame() 
    iter_csv = pd.read_csv(file_ 
        , sep=',' 
        , index_col=False 
        , header=0 
        , low_memory=False 
        , iterator=True 
        , chunksize=100000 
        , compression='gzip' 
        , memory_map=True 
        , encoding='utf-8') 

    df = pd.concat([chunk for chunk in iter_csv]) 
    stage = stage.append(df, ignore_index=True) 

# 2 - Takes 55 min to write 20m records from one dataframe 
stage.to_csv('output.csv' 
      , sep='|' 
      , header=True 
      , index=False 
      , chunksize=100000 
      , encoding='utf-8') 

del stage 

Ustaliliśmy, sprzętu i pamięci pracują, ale są one dość szerokie stoły (~ 100) z kolumny przeważnie numerycznych (po przecinku) danych.

Dziękuję

+0

Wąskie gardło sprzętu. Zachowaj kartę na przepustowość dysku, a także sprawdź, czy nie ma pustego miejsca na dysku. – Kartik

+0

Jak już wspomniałem, sprawdziłem miejsce na dysku i mogę skopiować duże pliki na dysk z oczekiwaną szybkością. Powinienem też wspomnieć, że piszę na dysk SSD (Samsung 950) –

+4

Spróbuj bez 'chunksize' kwag ... Może to być wiele rzeczy, takich jak cytowanie, konwersja wartości itp. Spróbuj [profil] (https://docs.python.org/3.5/library/profile.html) i zobacz, gdzie spędza większość swojego czasu. – Kartik

Odpowiedz

2

Czytasz skompresowanych plików i pisanie zwykłego tekstu pliku. Może być wąskie gardło IO.

Pisanie skompresowany plik mógłby przyspieszenie pisząc do 10x

stage.to_csv('output.csv.gz' 
     , sep='|' 
     , header=True 
     , index=False 
     , chunksize=100000 
     , compression='gzip' 
     , encoding='utf-8') 

Dodatkowo można eksperymentować z różnymi rozmiarami fragmentach i metod kompresji („bz2”, „xz”).