2017-05-26 20 views
11

Tôi có một khung dữ liệu gồm hơn 100.000 hàng và mỗi hàng có 100.000 cột, hoàn toàn với 10.000.000.000 giá trị nổi.Có phải lưu một khung dữ liệu rộng lớn vào sàn gỗ không?

Tôi đã đọc chúng trước đây trong một tệp csv (được phân tách bằng tab) và tôi đã đọc thành công chúng với máy Xeon 50 lõi với bộ nhớ 250 GB RAM và cố gắng viết ra như một thư mục .parq như sau:

Các phao nổi trong huge.csv được lưu dưới dạng chuỗi và là 125GB.

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

Nó đã được văn bản cho huge.parq cho gần một tuần và thư mục là 14GB và nó có vẻ như quá trình tiết kiệm .to_parquet sẽ không dừng lại bất cứ lúc nào sớm.

free -mh cho thấy rằng vẫn còn nhớ lại sẵn nhưng thời gian nó lấy để lưu các thư mục .parq là rất chậm:

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

Các câu hỏi là:

  • Với kích thước của các dataframe và máy tính, là nó khả thi để lưu các dataframe dask vào một tập tin gỗ ở tất cả?

  • Có bình thường đối với daskfastparquet mất quá nhiều thời gian để lưu các khung dữ liệu khổng lồ không?

  • Có cách nào để ước tính thời gian cần thiết để lưu tệp sàn gỗ không?

+0

10e9 giá trị nổi không có vẻ lớn đối với tôi. 1e5 cột mặc dù. Bạn đã cân nhắc sử dụng dask.array và HDF5 chưa? Đây có thể là phù hợp hơn để chặn trong cả hai chiều. – MRocklin

+0

Có một lý do tại sao dask.array và HDF5 là tốt hơn cho dataframes với >>> không.cột? "Chặn" là gì? – alvas

+0

Có bao nhiêu hàng trên mỗi phân vùng? read_csv chia nhỏ số byte, vì vậy tôi mong đợi một số nhỏ. Đối với mỗi cột của mỗi phân vùng, có một phần siêu dữ liệu riêng biệt phải tồn tại, làm cho siêu dữ liệu của bạn lớn hơn bất kỳ thứ gì tôi đã thấy trước đây - nhưng tôi hy vọng nó hoạt động. Để lưu trữ các mảng nổi 100kx100k giống như mảng, tôi thực sự khuyên bạn nên [zarr] (http://zarr.readthedocs.io/en/latest/). – mdurant

Trả lời

8

Như đã thảo luận trong các nhận xét ở trên, không có lý do lý thuyết nào khiến .to_parquet() không được đối phó với dữ liệu của bạn. Tuy nhiên, số lượng cột rất lớn, và bởi vì có một chi phí liên kết với mỗi cột, không có gì đáng ngạc nhiên khi quá trình này mất nhiều thời gian - đây không phải là trường hợp sử dụng điển hình.

Có vẻ như dữ liệu của bạn được coi là một mảng tốt nhất chứ không phải là bảng. Có các cơ chế lưu trữ mảng cho phép bạn chia nhỏ mọi kích thước, ví dụ zarr, cũng cho phép các hoạt động nén và tiền lọc khác nhau có thể sử dụng hiệu quả không gian đĩa. (Định dạng khác như HDF5 cũng được phổ biến cho một nhiệm vụ như thế này)

Một ví dụ về làm thế nào để lưu trữ một mảng 10k X 10k:

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) 

và bây giờ z.zarr/chứa 100 khối dữ liệu tập tin.

Trong trường hợp của bạn, phần khó đọc là đọc dữ liệu vì bạn không biết trước số hàng. Bạn có thể sử dụng

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

hoặc nó có thể hiệu quả hơn để quấn np.loadtxt với dask.delayed từ bỏ sân khấu dataframe.

+0

Có các bộ dữ liệu như KDD-2009 (http://www.kdd.org/kdd-cup/view/kdd-cup-2009/Data), có 15k cột và 50k bản ghi. Nó không phải là 100k bởi 100k, nhưng nó là một tập dữ liệu cột, do đó, nó không làm cho bất kỳ ý nghĩa để xử lý nó như là một ma trận. Bạn có biết các giới hạn của Dask DataFrame không? –

+2

Tôi sẽ nói rằng không có giới hạn cụ thể, nhưng giá mà bạn trả trong chi phí cho các tính toán khác nhau sẽ phụ thuộc vào những gì bạn đang cố gắng làm. Tôi sẽ được quan tâm để xem hiệu suất của tất cả các dữ liệu được lưu trữ như sàn gỗ (với sự lựa chọn hợp lý của các loại dữ liệu cột). – mdurant

Các vấn đề liên quan