大规模数据集的读存技巧
养生的控制人

浙江大学 控制科学与工程博士在读

文章来源:https://www.kaggle.com/rohanrao/tutorial-on-reading-large-datasets

本文以Kaggle上最近的Riiid竞赛为例,介绍几种大数据集的读取技巧,因为在大数据面前,常规的pd.read_csv 很容易就会爆内存了。

不同的库有不同的读取方式,这里主要介绍以下几种:

pandas
Dask
Datatable
Rapids

除了能从csv文件中读取数据,还有一种常见的作法是将数据集转换成另外的格式,使得数据集占用硬盘更少,读得更快,这里主要考虑以下数据格式

csv
feather
hdf5
jay
parquet
pickle

不同场景适应的方法可能不一样,没有哪个方法一定是最好的,大家按需选择。如果懒得看想直接看结论的直接看最后的意见即可。

Pandas

import pandas as pd
%%timedtypes = {"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)print("Train size:", data.shape)
Train size: (101230332, 10)
CPU times: user 8min 11s, sys: 10.8 s, total: 8min 22s
Wall time: 8min 22s

Dask

import dask.dataframe as dd
%%timedtypes = {"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 = dd.read_csv("../input/riiid-test-answer-prediction/train.csv", dtype=dtypes).compute()print("Train size:", data.shape)
Train size: (101230332, 10)
CPU times: user 9min 24s, sys: 28.8 s, total: 9min 52s
Wall time: 7min 41s

Datatable

import datatable as dt
%%timedata = dt.fread("../input/riiid-test-answer-prediction/train.csv")print("Train size:", data.shape)Train size: (101230332, 10)CPU times: user 52.5 s, sys: 18.4 s, total: 1min 10sWall time: 20.5 s

Rapids

import cudf
%%timedata = cudf.read_csv("../input/riiid-test-answer-prediction/train.csv")print("Train size:", data.shape)
Train size: (101230332, 10)
CPU times: user 4.58 s, sys: 3.31 s, total: 7.89 s
Wall time: 30.7 s

文件格式

首先介绍一下如何将数据存为不同格式

用datatable读取csv并装成pandas

reading data from csv using datatable and converting to pandas
data = dt.fread("../input/riiid-test-answer-prediction/train.csv").to_pandas()

将数据写为csv格式

data.to_csv("riiid_train.csv", index=False)

将数据写为hdf5

data.to_hdf("riiid_train.h5", "riiid_train")

将数据写为feather

data.to_feather("riiid_train.feather")

将数据写为parquet

data.to_parquet("riiid_train.parquet")

将数据写为pickle

data.to_pickle("riiid_train.pkl.gzip")

将数据写为jay

dt.Frame(data).to_jay("riiid_train.jay")

接下来看看不同数据格式的读取时间差异
csv

%%time

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)print("Train size:", data.shape)
Train size: (101230332, 10)
CPU times: user 8min 36s, sys: 11.3 s, total: 8min 48s
Wall time: 8min 49s

feather

%%timedata = pd.read_feather("../input/riiid-train-data-multiple-formats/riiid_train.feather")print("Train size:", data.shape)
Train size: (101230332, 10)
CPU times: user 2.59 s, sys: 8.91 s, total: 11.5 s
Wall time: 5.19 s

hdf5

%%timedata = 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 8.16 s, sys: 10.7 s, total: 18.9 s
Wall time: 19.8 s

jay

%%timedata = dt.fread("../input/riiid-train-data-multiple-formats/riiid_train.jay")print("Train size:", data.shape)
Train size: (101230332, 10)
CPU times: user 4.88 ms, sys: 7.35 ms, total: 12.2 ms
Wall time: 38 ms

parquet

%%timedata = pd.read_parquet("../input/riiid-train-data-multiple-formats/riiid_train.parquet")print("Train size:", data.shape)
Train size: (101230332, 10)
CPU times: user 29.9 s, sys: 20.5 s, total: 50.4 s
Wall time: 27.3 s

pickle

%%timedata = 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.65 s, sys: 7.08 s, total: 12.7 s
Wall time: 15 s

个人建议:如果遇到的数据表规模比较大,读取的时候可以采用Datatable,数据的存储可以使用jay或者feather。

python: 大规模数据集的读存技巧相关推荐

  1. 大规模数据集的读存技巧

    作者:养生的控制人 链接:https://zhuanlan.zhihu.com/p/336614195 本文转载自知乎,作者已授权,未经许可请勿二次转载 本文以Kaggle上最近的Riiid竞赛为例, ...

  2. python怎么导入数据集keras_keras使用Sequence类调用大规模数据集进行训练的实现

    使用Keras如果要使用大规模数据集对网络进行训练,就没办法先加载进内存再从内存直接传到显存了,除了使用Sequence类以外,还可以使用迭代器去生成数据,但迭代器无法在fit_generation里 ...

  3. python对excel某一列去重-「总结篇」Python中所有的Excel操作技巧

    原标题:「总结篇」Python中所有的Excel操作技巧 Python对于Excel的操作是多种多样的,掌握了相关用法就可以随心所欲的操作数据了! 操作xls文件 xlrd(读操作): import ...

  4. Python 内编写类的各种技巧和方法

    简介 有关 Python 内编写类的各种技巧和方法(构建和初始化.重载操作符.类描述.属性访问控制.自定义序列.反射机制.可调用对象.上下文管理.构建描述符对象.Pickling). 你可以把它当作一 ...

  5. 快速提高Python数据分析速度的八个技巧

    今天整理了几个在使用python进行数据分析的常用小技巧.命令.记得搭配Pandas+Jupyter Notebook使用哦. 01 使用Pandas  Profiling预览数据 这个神器我们在之前 ...

  6. 下列不是python对文件的读操作方法是-大工20春《数据挖掘》在线作业1【参考答案】...

    可做奥鹏全部院校作业论文!答案请添加qq:599792222 或 微信:1095258436 大工20春<数据挖掘>在线作业1 试卷总分:100  得分:100 一.单选题 (共 10 道 ...

  7. 机器学习13大规模数据集

    大型数据集的学习(Learning With Large Datasets) 如果我们有一个低方差的模型, 增加数据集的规模可以帮助你获得更好的结果. 我们应该怎样应对一个有 100 万条记录的训练集 ...

  8. 使用python对数据集进行批处理

    [机器学习]使用python对数据集进行批处理 只输入一张图像数据过程和一次性处理100张图像数据过程中,数组形状变换如下图所示: 这些数组形状可以在代码中输出出来: def get_data():( ...

  9. Intel Sandy Bridge/Ivy Bridge架构/微架构/流水线 (14) - 读存操作写存操作

    Load and Store Operation Overview 本节讲述读存与写存操作. Loads 当指令从回写式类型的存储器中的某个地址读取数据时,处理器会从高速缓存和存储器中查找数据.下表描 ...

  10. python语言中文怎么读-python中文读什么

    python中文叫什么 python中文叫什么? python中文叫蟒蛇,通常情况下,Python是一种计算机程序设计语言.是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随 ...

最新文章

  1. JVM内存泄漏检测与处理
  2. 【Java】反射( reflection)机制 详解
  3. shell脚本获取绝对路径
  4. nginx静态文件服务器_Linux分享文件?快速创建静态文件服务器
  5. linux系统下RocketMQ的集群搭建
  6. python3中的rang()函数
  7. ZJOI 2014 星系调查(推导)
  8. 【CloudXNS教您几招】如何让多ip域名配置游刃有余?(2)
  9. 在OpenStack虚拟机实例中创建swap分区的一种方法
  10. 【原创】C++关于创建和使用静态链接库
  11. 关于Http请求后返回json乱码的问题
  12. 用友u8不显示服务器名,用友u8提示对数据库服务器名
  13. android壁纸服务,android壁纸服务流程浅析
  14. 目标检测:Object Detection in 20 Years: A Survey
  15. PCL_点云数据处理方法概述
  16. 算法篇 干货!!!字母重排 打卡第七天
  17. 正多边形和多面体的对称群
  18. 谈谈关于网瘾的看法和建议
  19. 【OpenCV】 - 图像分割之分水岭算法,watershed()函数的输出,对marker和image的改变
  20. 上海创蓝253董事长_从世界记忆大师到互联网百强企业CEO:创蓝253钛牛哥的传奇之路...

热门文章

  1. 每天一道算法题:无重复字符的最长子串
  2. C#控件储备——信息提示控件toolTip
  3. 05-基础widgets
  4. Django之验证码的生成和使用
  5. String对象不可改变的特性
  6. Ubuntu 汉化及kate汉化和使用自带终端的解决方式
  7. Lattice Diamond 的学习之新建工程
  8. 一种支持多种并行环境的栅格地理计算并行算子
  9. [SPS2010] RC1 安装体验
  10. Cannot use a leading .. to exit above the top directory