【Python】大數(shù)據(jù)存儲技巧,快出csv文件10000倍!
大數(shù)據(jù)存儲格式對比

在之前文章中,我們對比了在遇到大數(shù)據(jù)時,不同數(shù)據(jù)處理工具包的優(yōu)劣,
是否擁有豐富的數(shù)據(jù)處理函數(shù); 是否讀取數(shù)據(jù)夠快; 是否需要額外設備(例如GPU)的支持等等。
但無論這些工具包處理數(shù)據(jù)的時間多快,在碰到例如10G以上的數(shù)據(jù)時,都還是會耗費一些時間的,快的可能幾十秒,慢的可能幾十分鐘,然后再進行一些特征抽取等等,快的話也得幾十分鐘,而此時,為了節(jié)省時間消耗,我們就需要將這些中間結果線存儲到磁盤上面,而不同格式的存儲,帶來的差別是巨大的,比如:
存儲一個大的文件,存成csv格式需要10G,但是存成其它格式可能就只需要2G; 存成csv文件讀取需要20分鐘,存成其它格式讀取只需要10秒。
存儲格式的選擇也會節(jié)省海量的時間,那么究竟選用何種存儲方式呢?本文我們就對比下面幾大流行的存儲格式。
csv feather hdf5 jay parquet pickle

csv
csv格式是使用最多的一個存儲格式,但是其存儲和讀取的速度會略慢。
feather
feather是一種可移植的文件格式,用于存儲Arrow表或數(shù)據(jù)幀(來自Python或R等語言),它在內(nèi)部使用Arrow-IPC格式。Feather是在Arrow項目早期創(chuàng)建的,作為Python(pandas)和R的快速、語言無關的數(shù)據(jù)幀存儲的概念證明。
feather可以顯著提高了數(shù)據(jù)集的讀取速度
hdf5
hdf5設計用于快速I/O處理和存儲,它是一個高性能的數(shù)據(jù)管理套件,可以用于存儲、管理和處理大型復雜數(shù)據(jù)。
jay
Datatable使用.jay(二進制)格式,這使得讀取數(shù)據(jù)集的速度非常快。
parquet
在Hadoop生態(tài)系統(tǒng)中,parquet被廣泛用作表格數(shù)據(jù)集的主要文件格式,Parquet使Hadoop生態(tài)系統(tǒng)中的任何項目都可以使用壓縮的、高效的列數(shù)據(jù)表示的優(yōu)勢?,F(xiàn)在parquet與Spark一起廣泛使用。這些年來,它變得更容易獲得和更有效,也得到了pandas的支持。
pickle
pickle模塊實現(xiàn)二進制協(xié)議,用于序列化和反序列化Python對象結構。Python對象可以以pickle文件的形式存儲,pandas可以直接讀取pickle文件。注意,
pickle模塊不安全。最好只unpickle你信任的數(shù)據(jù)。

1.csv讀取
dtypes = {
"row_id": "int64",
"timestamp": "int64",
"user_id": "int32",
"content_id": "int16",
"content_type_id": "boolean",
"task_container_id": "int16",
"user_answer": "int8",
"answered_correctly": "int8",
"prior_question_elapsed_time": "float32",
"prior_question_had_explanation": "boolean"
}
data = pd.read_csv("../input/riiid-test-answer-prediction/train.csv", dtype=dtypes)
# Train size: (101230332, 10)
# CPU times: user 8min 15s, sys: 11.7 s, total: 8min 27s
# Wall time: 9min 24s
2.feather讀取
%%time
data = pd.read_feather("../input/riiid-train-data-multiple-formats/riiid_train.feather")
print("Train size:", data.shape)
# Train size: (101230332, 10)
# CPU times: user 3 s, sys: 17.5 s, total: 20.5 s
# Wall time: 19.6 s
3.hdf5讀取
%%time
data = pd.read_hdf("../input/riiid-train-data-multiple-formats/riiid_train.h5", "riiid_train")
print("Train size:", data.shape)
# Train size: (101230332, 10)
# CPU times: user 10.5 s, sys: 10.5 s, total: 20.9 s
# Wall time: 53.8 s
4.jay讀取
%%time
data = dt.fread("../input/riiid-train-data-multiple-formats/riiid_train.jay")
print("Train size:", data.shape)
# Train size: (101230332, 10)
# CPU times: user 4.66 ms, sys: 2.77 ms, total: 7.43 ms
# Wall time: 24.5 ms
5.parquet讀取
%%time
data = pd.read_parquet("../input/riiid-train-data-multiple-formats/riiid_train.parquet")
print("Train size:", data.shape)
# Train size: (101230332, 10)
# CPU times: user 43.4 s, sys: 17.7 s, total: 1min 1s
# Wall time: 47.2 s
6.pickle讀取
%%time
data = pd.read_pickle("../input/riiid-train-data-multiple-formats/riiid_train.pkl.gzip")
print("Train size:", data.shape)
# Train size: (101230332, 10)
# CPU times: user 5.75 s, sys: 8.7 s, total: 14.5 s
# Wall time: 42.3 s
csv的文件存儲,在讀取的時候是最為消耗時間的;如果數(shù)據(jù)大的話不建議存儲為csv形式; jay文件是讀取最快的,相較于其他的快了幾百倍,比csv則快了千萬倍; feather,hdf5,parquet和pickle也都很快,比csv文件的讀取快10倍不止。

Tutorial on reading large datasets https://docs.python.org/3/library/pickle.html https://parquet.apache.org/documentation/latest/ https://www.hdfgroup.org/solutions/hdf5
往期精彩回顧
本站qq群851320808,加入微信群請掃碼:
