前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Python】大数据存储技巧,快出csv文件10000倍!

【Python】大数据存储技巧,快出csv文件10000倍!

作者头像
黄博的机器学习圈子
发布2021-07-07 15:15:17
2.8K0
发布2021-07-07 15:15:17
举报
文章被收录于专栏:机器学习初学者精选文章

作者:杰少

大数据存储格式对比

简 介

在之前文章中,我们对比了在遇到大数据时,不同数据处理工具包的优劣,

  • 是否拥有丰富的数据处理函数;
  • 是否读取数据够快;
  • 是否需要额外设备(例如GPU)的支持等等。

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

  • 存储一个大的文件,存成csv格式需要10G,但是存成其它格式可能就只需要2G;
  • 存成csv文件读取需要20分钟,存成其它格式读取只需要10秒

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

  1. csv
  2. feather
  3. hdf5
  4. jay
  5. parquet
  6. 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你信任的数据。

代 码

1.csv读取

代码语言:javascript
复制
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读取

代码语言:javascript
复制
%%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读取

代码语言:javascript
复制
%%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读取

代码语言:javascript
复制
%%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读取

代码语言:javascript
复制
%%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读取

代码语言:javascript
复制
%%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的文件存储,在读取的时候是最为消耗时间的;如果数据大的话不建议存储为csv形式;
  • jay文件是读取最快的,相较于其他的快了几百倍,比csv则快了千万倍;
  • feather,hdf5,parquet和pickle也都很快,比csv文件的读取快10倍不止。

参考文献

  1. Tutorial on reading large datasets
  2. https://docs.python.org/3/library/pickle.html
  3. https://parquet.apache.org/documentation/latest/
  4. https://www.hdfgroup.org/solutions/hdf5
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-06-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 机器学习初学者 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 2.feather读取
  • 3.hdf5读取
  • 4.jay读取
  • 5.parquet读取
  • 6.pickle读取
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档