对比不同主流存储格式(csv, feather, jay, h5, parquet, pickle)的读取效率

对比不同主流存储格式(csv, feather, jay, h5, parquet, pickle)的读取效率

参考:

《大数据存储技巧,快出csv文件10000倍!》

《FAST Reading w/ Pickle, Feather, Parquet, Jay》

一、引言

在遇到大数据时,不同数据处理工具包的优劣,

是否拥有丰富的数据处理函数;

是否读取数据够快;

是否需要额外设备(例如GPU)的支持等等。

但无论这些工具包处理数据的时间多快,在碰到例如10G以上的数据时,都还是会耗费一些时间的,快的可能几十秒,慢的可能几十分钟,然后再进行一些特征抽取等等,快的话也得几十分钟,而此时,为了节省时间消耗,我们就需要将这些中间结果线存储到磁盘上面,而不同格式的存储,带来的差别是巨大的,比如:

存储一个大的文件,存成csv格式需要10G,但是存成其它格式可能就只需要2G;

存成csv文件读取需要20分钟,存成其它格式读取只需要10秒。

存储格式的选择也会节省海量的时间,那么究竟选用何种存储方式呢?本文我们就对比下面几大流行的存储格式。

csv

feather

hdf5

jay

parquet

pickle

二、数据存储格式对比

01 csv

csv格式是使用最多的一个存储格式,但是其存储和读取的速度会略慢。

02 feather

feather是一种可移植的文件格式,用于存储Arrow表或数据帧(来自Python或R等语言),它在内部使用Arrow-IPC格式。Feather是在Arrow项目早期创建的,作为Python(pandas)和R的快速、语言无关的数据帧存储的概念证明。

feather可以显著提高了数据集的读取速度

03 hdf5

hdf5设计用于快速I/O处理和存储,它是一个高性能的数据管理套件,可以用于存储、管理和处理大型复杂数据。

04 jay

Datatable使用.jay(二进制)格式,这使得读取数据集的速度非常快。

05 parquet

在Hadoop生态系统中,parquet被广泛用作表格数据集的主要文件格式,Parquet使Hadoop生态系统中的任何项目都可以使用压缩的、高效的列数据表示的优势。现在parquet与Spark一起广泛使用。这些年来,它变得更容易获得和更有效,也得到了pandas的支持。

06 pickle

pickle模块实现二进制协议,用于序列化和反序列化Python对象结构。Python对象可以以pickle文件的形式存储,pandas可以直接读取pickle文件。注意,

pickle模块不安全。最好只unpickle你信任的数据。

三、存储代码(从csv文件转换成其他格式存储)

01 源数据

You may find the train data in all this formats in this dataset: https://www.kaggle.com/pedrocouto39/jane-street-market-train-data-best-formats

# datatable installation with internet

!pip install datatable==0.11.0 > /dev/null

import numpy as np

import pandas as pd

import datatable as dt

import os

for dirname, _, filenames in os.walk('/kaggle/input'):

for filename in filenames:

print(os.path.join(dirname, filename))

# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using "Save & Run All"

# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session

02 获取数据后转换成其他格式

The formats that will be created are:

Pickle - great for object serialization and though it has a slower performance when comparing with other formats, it may work for our porpuse.Feather - is a fast, lightweight, and easy-to-use binary file format for storing data frames.Parquet - compared to a traditional approach where data is stored in row-oriented approach, parquet is more efficient in terms of storage and performance.Jay - also a binary format, that means it is fast, lightweight, and easy-to-use binary file format for storing data frames.

train = pd.read_csv("../input/jane-street-market-prediction/train.csv")

# writing dataset as pickle

train.to_pickle("jane_street_train.pkl.gzip")

# writing dataset as feather

train.to_feather("jane_street_train.feather")

# writing dataset as parquet

train.to_parquet("jane_street_train.parquet")

# writing dataset as jay

dt.Frame(train).to_jay("jane_street_train.jay")

# writing dataset as hdf5

train.to_hdf("jane_street_train.h5", "jane_street_train")

四、读取及代码

同时统计的wall time(即墙上时钟)【使用time.time()】及统计cpu时间【使用time.clock()】。【参见《python time包中的time.time()和time.clock()区别和使用》】

01 Pickle

#time

t0=time.time()

t1=time.clock()

train_pickle = pd.read_pickle("./jane_street_train.pkl.gzip")

t2=time.time()

t3=time.clock()

print("cpu time:",t3-t1)

print("wall time:",t2-t0)

train_pickle.info()

RangeIndex: 2390491 entries, 0 to 2390490

Columns: 138 entries, date to ts_id

dtypes: float64(135), int64(3)

memory usage: 2.5 GB

02 Feather

#time

t0=time.time()

t1=time.clock()

train_feather = pd.read_feather("./jane_street_train.feather")

t2=time.time()

t3=time.clock()

print("cpu time:",t3-t1)

print("wall time:",t2-t0)

train_feather.info()

RangeIndex: 2390491 entries, 0 to 2390490

Columns: 138 entries, date to ts_id

dtypes: float64(135), int64(3)

memory usage: 2.5 GB

03 Parquet

#time

t0=time.time()

t1=time.clock()

train_parquet = pd.read_parquet("./jane_street_train.parquet")

t2=time.time()

t3=time.clock()

print("cpu time:",t3-t1)

print("wall time:",t2-t0)

train_parquet.info()

RangeIndex: 2390491 entries, 0 to 2390490

Columns: 138 entries, date to ts_id

dtypes: float64(135), int64(3)

memory usage: 2.5 GB

04 Jay

#time

t0=time.time()

t1=time.clock()

train_jay = dt.fread("./jane_street_train.jay")

t2=time.time()

t3=time.clock()

print("cpu time:",t3-t1)

print("wall time:",t2-t0)

train_jay.shape

(2390491, 138)

05 结论

csv的文件存储,在读取的时候是最为消耗时间的;如果数据大的话不建议存储为csv形式;

jay文件是读取最快的,相较于其他的快了几百倍,比csv则快了千万倍;

feather,hdf5,parquet和pickle也都很快,比csv文件的读取快10倍不止。

相关阅读

手游魔王地府 梦幻西游手游魔王和地府哪个好
365最专业的数据服务平台

手游魔王地府 梦幻西游手游魔王和地府哪个好

📅 07-04 👁️ 3516
苹果笔记本报价
det365官网登录

苹果笔记本报价

📅 07-07 👁️ 2273
《热血传奇》资深玩家都不知道的那些玄妙之处
det365官网登录

《热血传奇》资深玩家都不知道的那些玄妙之处

📅 06-27 👁️ 7485