参考:

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

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

一、引言

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

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

  • 是否读取数据够快;

  • 是否需要额外设备(例如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你信任的数据。

三、存储代码(从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/nullimport numpy as np
import pandas as pd
import datatable as dtimport 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:

  1. Pickle - great for object serialization and though it has a slower performance when comparing with other formats, it may work for our porpuse.
  2. Feather - is a fast, lightweight, and easy-to-use binary file format for storing data frames.
  3. Parquet - compared to a traditional approach where data is stored in row-oriented approach, parquet is more efficient in terms of storage and performance.
  4. 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()
<class 'pandas.core.frame.DataFrame'>
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()
<class 'pandas.core.frame.DataFrame'>
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()
<class 'pandas.core.frame.DataFrame'>
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倍不止。

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

  1. pyspark —— spark dataframe 从hdfs读写文件:按照指定文件格式读写文件(读写csv、json、text文件,读取hive表,读取MySQL表)、按照指定分隔符读写文件

    spark有3种数据结构--RDD.DataFrame.DataSet.这里展示的文件读写方式,都是针对dataFrame数据结构的,也就是文件读进来之后,是一个spark dataFrame. 0. ...

  2. csv java web 导入_DAY5-step9 使用CSV模块和Pandas在Python中读取和写入CSV文件

    什么是CSV文件? CSV文件是一种纯文本文件,其使用特定的结构来排列表格数据. CSV是一种紧凑,简单且通用的数据交换通用格式. 许多在线服务允许其用户将网站中的表格数据导出到CSV文件中. CSV ...

  3. html5 filereader读取文件,H5的FileReader分布读取文件应该如何使用以及其方法简介...

    这次给大家带来H5的FileReader分布读取文件应该如何使用以及其方法简介,H5的FileReader分布读取文件的使用以及其方法简介的注意事项有哪些,下面就是实战案例,一起来看一下. 先介绍一下 ...

  4. pandas使用to_feather函数将dataframe保存为feather文件(需要依赖pyarrow包)提升大文件读取效率、pandas使用read_feather函数读取feather文件

    pandas使用to_feather函数将dataframe保存为feather文件(需要依赖pyarrow包)提升大文件读取效率.pandas使用read_feather函数读取feather文件. ...

  5. 【puthon】把大量csv文件写入h5文件制作数据集

    背景 每一个样本的数据被写入了一个csv中,在制作数据集时,需要先将大量的csv文件写入到一个h5文件中 样例代码 import os import sys import h5py import nu ...

  6. 各大媒体优劣对比_主流酱油选购对比

    酱油是不是越贵越好,牌子越大越好,或者广告曝光率越高越好,选购酱油应该关注那些参数,带着这些疑问,我专门跑当地大润发超市,现场比较各种品牌酱油的差异,以飨值友(本人非专业,只根据坊间的一些简单比较来判 ...

  7. 软件研发管理工具Ones横评,对比国内外主流项目管理软件

    深圳复临科技有限公司 (ONES) 成立于 2015 年,号称国内领先的企业级研发管理解决方案提供商. ONES 研发管理工具包括项目管理.测试管理.流水线管理.效能管理.工单管理.知识库管理等能力. ...

  8. 视觉SLAM——特征点法与直接法对比以及主流开源方案对比 ORB LSD SVO DSO

    前言 单目视觉SLAM可以根据其前端视觉里程计或是后端优化的具体实现算法进行分类:前端可以分为特征点法与直接法,后端可以分为基于滤波器和基于非线性优化.其中在后端上目前已经公认基于非线性优化的方法在同 ...

  9. 视觉SLAM——特征点法与直接法对比以及主流开源方案对比 LSD SVO ORB DSO

    前言 单目视觉SLAM可以根据其前端视觉里程计或是后端优化的具体实现算法进行分类:前端可以分为特征点法与直接法,后端可以分为基于滤波器和基于非线性优化.其中在后端上目前已经公认基于非线性优化的方法在同 ...

  10. 国产 神通数据库 对比国际主流数据库的优势

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 以下纯属 ...

最新文章

  1. Apache日志配置参数说明
  2. java 多线程 原子操作_线程安全之原子操作
  3. 简单有趣的 NLP 教程:手把手教你用 PyTorch 辨别自然语言(附代码)
  4. [bzoj2400]Optimal Marks
  5. python 排序统计滤波器_马尔可夫链+贝叶斯滤波器的Python展示
  6. mysql 设计两个主键都不可重复_18个MySQL面试题剖析(答案解析),听说身为程序员的你还没掌握...
  7. Bootstrap页面布局17 - BS选项卡
  8. sklearn朴素贝叶斯分类器_手撕朴素贝叶斯分类器源码(Naive Bayesian)
  9. 报错:‘nodemon‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。
  10. 【基础概念大总结】— 网络安全 Java 基础知识大汇总
  11. jquery操作select、radio、checkbox表单元素
  12. linux gif录制工具,Ubuntu中的Gif动画录制工具byzanz
  13. 编译原理实验二【语法分析程序设计】
  14. MaskRCNN源码解析1:整体结构概述
  15. 漫谈分布式游戏服务器
  16. 实现数据开放共享的方法
  17. 面向接口编程VS《倚天屠龙记》里张三丰教无忌打太极
  18. c++实现currency类(两种)
  19. iOS 热更新技术探索
  20. VMware出现配置文件 .vmx 是由VMware产品创建,但该产品与此版 VMware workstation 不兼容,因此无法使用--VMware版本不兼容问题

热门文章

  1. 今日头条秋招前端笔试附加题解题思路
  2. 干货!图像集分类大杀器--混合黎曼度量学习
  3. VS-( 图片的上传 )
  4. 从月薪3500到700万——一个大学生的成长经历
  5. bootstrap按钮组btn-group
  6. 强化学习Q learning算法最简单的入门(含java实现的小例子)
  7. 高中OJ3502. 【NOIP2013模拟11.4B组】方格游戏(game)
  8. 推荐几个练习键盘打字的工具【自己用过的】
  9. 基于Java实现的商品推荐系统
  10. CF736 D1 格点图,皮克定理