2017-05-26 15 views
11

100.000'den fazla satırdan oluşan bir veri çerçevem ​​var ve her satırda 100.000 sütun var, toplam 10.000.000.000 float değerine sahip.HUGE veri bloğunu parke içine kaydetmek mümkün mü?

Ben csv (sekme ayrılmış) dosyasında daha önce bunları okumayı başardınız ve başarıyla 250GB RAM ile 50 çekirdek Xeon makinesine bunları okuyup gibi bir .parq dizin olarak dışarı yazmaya çalışıyorum:

huge.csv'daki floatlar dizge olarak kaydedildi ve 125GB.

import dask.dataframe as dd 
filename = 'huge.csv' 
df = dd.read_csv(filename, delimiter='\t', sample=500000000) 
df.to_parquet('huge.parq') 

Bir hafta yakın için huge.parq yazılı olmuştur ve dizin 14GB olduğunu ve .to_parquet yakın zamanda durdurmak için gitmiyor kurtarma süreci gibi görünüyor.

$ free -mh 
       total  used  free  shared buff/cache available 
Mem:   251G   98G   52G   10M  101G  152G 
Swap:   238G   0B  238G 

soru vardır:

  • boyutu göz önüne alındığında

    Ve free -mh hala orada bellek sol ancak .parq dizini kurtarmak için alıyor zaman müthiş yavaş olduğunu gösteriyor dataframe ve makine, dask dataframe'i bir parke dosyasına kaydetmek mümkün mü?

  • Büyük veri sayfalarını kaydetmek için dask ve fastparquet'un normal olması normal midir?

  • Parke dosyasını kaydetmek için gereken süreyi tahmin etmenin bir yolu var mı? Yukarıdaki açıklamalarda anlatıldığı gibi

+0

10e9 float değerleri bana göre büyük görünmüyor. 1e5 sütunlar olsa da. Dask.array ve HDF5 kullanmayı düşündünüz mü? Bunlar her iki boyutta da engelleme için daha uygun olabilir. – MRocklin

+0

Dask.array ve HDF5'in >>> no.sütunların "Engelleme" nedir? – alvas

+0

Bölme başına kaç satır? read_csv, bayt sayısını böler, bu yüzden küçük bir sayı beklerim. Her bölümün her bir sütununda, meta verilerinizin daha önce gördüğümden daha büyük olmasını sağlayan ayrı bir meta veri parçası vardır - ancak çalışmasını beklerdim. Dizi benzeri 100kx100k şamandıraları saklamak için, aslında [zarr] 'ı (http://zarr.readthedocs.io/en/latest/) tavsiye ederim. – mdurant

cevap

8

, .to_parquet() verilerinizin ile baş gerektiğini teorik bir sebep yoktur. Bununla birlikte, sütun sayısı çok büyüktür ve her biri ile ilişkili bir yük olduğu için, sürecin uzun sürmesi şaşırtıcı değildir - bu tipik kullanım durumu değildir.

Verilerinizin bir tablodan ziyade bir dizi olarak düşünüldüğü anlaşılıyor. Her boyutta parçalanabilmenizi sağlayan dizi depolama mekanizmaları vardır, örneğin zarr, disk alanını verimli bir şekilde kullanabilen çeşitli sıkıştırma ve ön filtreleme işlemlerine de izin verir. (HDF5 gibi diğer formatlar böyle bir görev için de popülerdir)

bir 10k x 10k diziyi saklamak için nasıl bir örnek: Şimdi

import dask.array as da 
import zarr 
arr = da.random.random(size=(10000, 10000), chunks=(1000, 1000)) 
z = zarr.open_array('z.zarr', shape=(10000, 10000), chunks=(1000, 1000), mode='w', dtype='float64') 
arr.store(z) 

ve z.zarr/100 veri dosyası parçalarını içeriyor.

Sizin durumunuzda, zor olan bölüm, satır sayısını önceden bilmediğiniz için verileri okuyor. Sen

df = dataframe.read_csv(..) 
len(df) # get length 
z = zarr.open_arr(...) # provide dtype, size and chunk appropriately 
df.values.store(z) 

kullanabilir veya dataframe sahne vazgeçmek dask.delayed ile np.loadtxt sarmak için daha verimli olabilir.

+0

sütununuz varsa bu durum daha güzel olur. KDD-2009 (http://www.kdd.org/kdd-cup/view/kdd-cup-2009/Data) gibi veri kümeleri vardır. sütunlar ve 50k kayıtları. 100k tarafından 100k değil, ancak bir sütunlu veri kümesidir, bu yüzden bir matris olarak ele alınması herhangi bir anlam ifade etmez. Dask DataFrame'in sınırlarını biliyor musunuz? –

+2

Belli bir sınır olmadığını söyleyebilirim, ancak çeşitli hesaplamalar için ek yüklerde ödediğiniz fiyat, yapmaya çalıştığınız şeye bağlı olacaktır. Parke olarak saklanan tüm verilerin performansını (sütun veri türlerinin mantıklı seçenekleriyle) görmek isterim. – mdurant

İlgili konular