2016-07-25 10 views
8

Ben~ 50GB CSV ışık dosya işlemlerinden

  • için farklı bir biçim dizesi şartname uygula CSV
  • sütunlarda birkaç alt kümelerini Take Ben hangi bir ~ 50GB CSV dosyası var hızlandırılması CSV'nin her bir sütun alt kümesi.
  • Her bir alt küme için kendi biçim belirtimine sahip yeni bir CSV çıktı.

pandalar kullanabilir ve DataFrame üretmek üzere (yalnızca yarım milyondan fazla satır) kullanışlı bir öbek-boyutu parçaları yineleme ve her çıkış CSV yığın ekleme genel bir yaklaşım için seçti. Böyle Yani bir şey:

_chunk_size = 630100 

column_mapping = { 
    'first_output_specification' : ['Scen', 'MS', 'Time', 'CCF2', 'ESW10'], 
    # ..... similar mappings for rest of output specifications 
} 
union_of_used_cols = ['Scen', 'MS', 'Time', 'CCF1', 'CCF2', 'VS', 'ESW 0.00397', 'ESW0.08', 
        'ESW0.25', 'ESW1', 'ESW 2', 'ESW3', 'ESW 5', 'ESW7', 'ESW 10', 'ESW12', 
        'ESW 15', 'ESW18', 'ESW 20', 'ESW22', 'ESW 25', 'ESW30', 'ESW 35', 
        'ESW40'] 

chnk_iter = pd.read_csv('my_big_csv.csv', header=0, index_col=False, 
         iterator=True, na_filter=False, usecols=union_of_used_cols) 

cnt = 0 
while cnt < 100: 
    chnk = chnk_iter.get_chunk(_chunk_size) 
    chnk.to_csv('first_output_specification', float_format='%.8f', 
       columns=column_mapping['first_output_specification'], 
       mode='a', 
       header=True, 
       index=False) 
    # ..... do the same thing for the rest of the output specifications 

    cnt += 1 

Benim sorunum bu gerçekten yavaş olmasıdır. Her bir parçanın CSV dosyalarına ekleme yapmak için bir dakikanız var ve bu yüzden görev tamamlanınca neredeyse 2 saate bakıyorum.

Sadece CSV'de okurken sütun alt kümelerinin birleşimini kullanmanın yanı sıra na_filter=False'u ayarlayarak birkaç optimizasyon yapmayı denedim, ancak yine de kabul edilemez.

Python'da bir CSV dosyasının bu hafif işlenmesini daha hızlı bir şekilde yapıp yapamayacağımı merak ettim, ya yaklaşımımın optimizasyonu ya da düzeltmesi ile ya da belki de bu tür işler için daha uygun bir araç var. Sonra Pandalar ... bana (deneyimsiz bir Pandalar kullanıcı) bu Pandalar ile alabildiğine hızlı gibi görünüyor, ama ben çok iyi yanılmış olabilir.

+1

Veritabanı yaklaşımına geçmek mümkün mü? Bu büyük bir csv dosyası! –

+1

@Jylo Gerçekten bunun böyle olmasını diliyorum, ama hayır. –

+0

'Chunksize', her yığınta olmasını istediğiniz satır sayısını içerir mi? – albert

cevap

6

Bir Panda'nın veri çerçevesinden herhangi bir avantaj elde ettiğinizi sanmıyorum, bu yüzden sadece ek yükü ekliyor. Bunun yerine, kullanımı kolay ve güzel bir şekilde optimize edilmiş olan python'un kendi CSV module'unu kullanabilirsiniz.

Çok daha büyük parçaları (bir seferde 10MB) bellekte okumayı düşünün, daha sonra ilerlemeden önce yeniden biçimlendirilmiş sütun alt kümelerini yazmayı deneyin. sonraki parçaya. Bu şekilde, giriş dosyası sadece bir kez okunur ve ayrıştırılır. deneyebilirsin

bir diğer yaklaşımı (Python nesneleri oluşturmak zorunda ve kullanılmamış sütunlarda verileri için bellek değil ki) Unix cut komutuyla bilgileri yalnızca sütunları ayıklamak için preprocess şudur: cut -d, -f1,3,5 somedata.csv

Son olarak, kodun CPU bağlı kısmı, izleme JIT'si aracılığıyla en iyi duruma getirilecek şekilde, kodu PyPy'un altında çalıştırmayı deneyin.

0

Python csv modülünü ve jeneratörlerini kullanmayı denerim.

Jeneratörleri, büyük sunucu günlüklerini ayrıştırmak için diğer yaklaşımlardan çok daha hızlı buldum.

import csv 

def reader(csv_filename): 
    with open(csv_filename, 'r') as f: 
     csvreader = csv.reader(f, delimiter=',', quotechar="'") 
     for line in csvreader: 
      yield line # line is a tuple 

def formatter(lines): 
    for line in lines: 
     # format line according to specs 
     yield formatted_line 

def write(lines, csv_filename): 
    with open(csv_filename, 'w') as f: 
     writer = csv.writer(f) 
     for line in lines: 
      writer.writerow(line) 

lines = reader('myfile.in.csv') 
formatted_lines = formatter(lines) 
write(formatted_lines, 'myfile.out.csv') 

Bu, yalnızca tek çıkış csv içine tek giriş csv dönüştüren bir okuma, ancak çıkış birkaç dosya için biçimlendirici ve yazar yazabiliriz.

(Şimdi, bu sorunun bir aylık olduğunu görüyorum - sorununuzu zaten çözdüğünüzden emin değilseniz - eğer değilse ve daha ayrıntılı açıklamalar/örnekler istiyorsanız bana bildirin.

0

CPU disk erişiminden daha hızlıdır. Bir numara, dosyanızı sıkıştırmak ve bundan okumaktır.

import gzip 

with gzip.open('input.gz','r') as fin: 
    for line in fin: 
     print('got line', line) 
İlgili konular