数据加载很慢_Vaex真香!几秒钟就能处理数十亿行数据,比Pandas、Dask更好用
Python中的大数据分析正在复兴。这一切都是从NumPy开始的,它也是我在本文中介绍的工具背后的构建块之一。
2006年,大数据这个话题逐渐受到关注,尤其是随着Hadoop的发布。
Pandas因为它的数据帧而紧随其后。
2014年是大数据成为主流的一年,也是Apache Spark发布的一年。
2018年,Dask和其他用于Python数据分析的库相继问世。
技术更迭速度实在太快了,每个月我都能找到一个新的工具,作为一名IT从业者,需要时刻保持与最新技术的联系。如果你认为这篇文章是关于Dask的,那你就大错特错了。在这里,给大家分享一个我发现的另一个用于数据分析的Python库,好用到飞起!
认识Vaex
Vaex是一个高性能的Python库,用于惰性核心数据帧(类似于Pandas),以可视化和探索大型表格数据集。它可以每秒计算超过十亿行的基本统计数据,并且支持多种可视化方式,允许对大数据进行交互式探索。
1、Vaex vs Dask
Vaex与Dask不相似,但与Dask数据帧相似,后者构建在pandas数据帧之上。这意味着Dask继承了pandas的问题,比如数据必须完全加载到RAM中才能进行处理。但是Vaex不是这样的。
Vaex不会复制数据帧,因此它可以在主存较小的机器上处理较大的数据帧。
Vaex和Dask都使用延迟处理。唯一的区别是Vaex只在需要时计算字段,而Dask则需要显式使用计算函数。
数据需要采用HDF5或Apache Arrow格式才能充分利用Vaex。
2、安装Vaex
安装Vaex与安装任何其他Python库一样简单:
pip install vaex
我们开始吧
让我们创建一个包含10亿行和1000列的pandas数据框来创建一个大数据文件。
import vaex
import pandas as pd
import numpy as np
n_rows = 1000000
n_cols = 1000
df = pd.DataFrame(np.random.randint(0, 100, size=(n_rows, n_cols)), columns=['col%d' % i for i in range(n_cols)])
df.head()
这个数据帧将会使用多少主内存?
df.info(memory_usage='deep')
我们要把该数据帧保存到磁盘上,以便以后用Vaex读取它。
file_path = 'big_file.csv'
df.to_csv(file_path, index=False)
通过直接使用Vaex读取整个CSV文件,我们不会获得太多的速度,因为这与Pandas相似。我的笔记本电脑需要大约85秒。
但是,当我们将CSV转换为HDF5(分层数据格式版本5)时,你就能了解到Vaex的好处了。Vaex具有转换的功能,该功能甚至可以通过转换较小的块来支持大于主内存的文件。
由于内存限制,我们无法使用Pandas打开大文件,但是我们可以将其隐藏为HDF5,使用Vaex处理可以轻松处理。
dv = vaex.from_csv(file_path, convert=True, chunk_size=5_000_000)
该功能自动创建HDF5文件并将其永久保存到磁盘上。
让我们检查一下dv类型。
type(dv)
# 输出
vaex.hdf5.dataset.Hdf5MemoryMapped
现在,让我们使用Vaex读取7.5 GB的数据集,测试读取速度。
dv = vaex.open('big_file.csv.hdf5')
Vaex用1秒的时间就执行完上面的命令。但Vaex实际上并没有读取文件,因为加载很慢。
让我们通过计算col1的和来强制读取它。
suma = dv.col1.sum()
suma
# 数组(49486599)
看到测试结果时,你会非常惊讶,Vaex只花了不到1秒的时间,就计算出了总和。它是怎么做到的呢?通过使用内存映射。
1、绘图
Vaex在绘制数据时也很快,它具有特殊的绘图功能plot1d、plot2d和plot2d_等高线。
dv.plot1d(dv.col2, figsize=(14, 7))
2、虚拟列
Vaex在添加新列时会创建一个虚拟列,该列不占用主内存,因为它是动态计算的。
dv['col1_plus_col2'] = dv.col1 + dv.col2
dv['col1_plus_col2']
3、有效过滤
Vaex在过滤数据时不会创建数据帧副本,这样更节省内存。
dvv = dv[dv.col1 > 90]
聚合
聚集的工作原理与Panddas略有不同,但重要的是,它们的速度非常快。
让我们计算一个二进制列,其中col1≥50。
dv['col1_50'] = dv.col1 >= 50
Vaex在一个命令中组合group by和aggregation。下面的命令按“col1_50”列对数据进行分组,并计算col3列的总和。
dv_group = dv.groupby(dv['col1_50'], agg=vaex.agg.sum(dv['col3']))
dv_group
连接
Vaex在不创建内存副本的情况下连接数据,这样可以节省主内存。Pandas用户熟悉的 join 函数:
dv_join = dv.join(dv_group, on=’col1_50')
最后
看完有没有觉得大开眼界?
平时,我们一般都会用Pandas和Dask等库,但是Python的读取速度实在不敢恭维,这也是它的最大缺点了,有了Vaex,相信能帮助大家提高一些读取速度。
希望以上内容,能给大家带来帮助,喜欢本文的同学记得转发+收藏哦~
关注我们的公众号:为AI呐喊(weainahan)可以学到更多知识!
数据加载很慢_Vaex真香!几秒钟就能处理数十亿行数据,比Pandas、Dask更好用相关推荐
- vaex 处理海量数据_Vaex真香!几秒钟就能处理数十亿行数据,比Pandas、Dask更好用...
Python中的大数据分析正在复兴.这一切都是从NumPy开始的,它也是我在本文中介绍的工具背后的构建块之一. 2006年,大数据这个话题逐渐受到关注,尤其是随着Hadoop的发布. Pandas因为 ...
- ElasticSearch 在数十亿级别数据下,如何提高查询效率?
来源:https://zhuanlan.zhihu.com/p/60458049 面试题 es 在数据量很大的情况下(数十亿级别)如何提高查询效率啊? 面试官心理分析 这个问题是肯定要问的,说白了,就 ...
- 【ElasticSearch】ElasticSearch在数十亿级别数据下,如何提高查询效率? 性能优化
1.概述 转载:https://zhuanlan.zhihu.com/p/60458049 这里面主要有个filesystem cache 服务这个想法很好. 面试题 es 在数据量很大的情况下(数十 ...
- sql索引从入门到精通(十亿行数据测试报告)
导读部分 ----------------------------------------------------------------------------------------------- ...
- PyTorch1.12 亮点一览 | DataPipe + TorchArrow 新的数据加载与处理范式
目录 前言 现有的 Dataset 和 DataLoader 及其存在的问题 新的数据加载方式:DataPipe 与 DataLoader2 结构化数据处理新范式:TorchArrow 总结 参考链接 ...
- pandas入门(6)——数据加载、存储与文件格式
pandas入门(6)--数据加载.存储与文件格式 输入输出通常可以划分为几个大类:读取文本文件和其他更高效的磁盘存储格式,加载数据库中的数据,利用Web API操作网络资源 一.读取文本格式数据 函 ...
- hive 复合类型_hive原生和复合类型的数据加载和使用
原生类型 原生类型包括TINYINT,SMALLINT,INT,BIGINT,BOOLEAN,FLOAT,DOUBLE,STRING,BINARY (Hive 0.8.0以上才可用),TIMESTAM ...
- 【学习系列7】Pytorch中的数据加载
目录 1. 模型中使用数据加载器的目的 2. 数据集类 3. 迭代数据集 1. 模型中使用数据加载器的目的 在前面的线性回归横型中,我们使用的数据很少,所以直接把全部数据放到锁型中去使用. 但是在深度 ...
- 已解决微软Office2016 Excel卡顿\缓慢、打开第二个文件加载很慢问题(亲测有效)
已解决微软Office2016 Excel卡顿\缓慢.打开第二个文件加载很慢问题(亲测有效) 文章目录 问题描述 问题分析 解决方法1 解决方法2 解决方法3 1) 修改基本设置 2)修改配置文件 千 ...
最新文章
- android 蓝牙耗电量,外媒测试手机蓝牙耗电情况:近乎毫无影响
- AI“生死”落地:谁有资格入选AI Top 30+案例?
- RISC-V的自定义CPU悖论
- JavaScript发布订阅者模式
- 疫情下跨境电商逆势增长,大数据告诉你如何抓住跨境网购新趋势
- 深入react技术栈(2):JSX语法
- 2016-5-31 问题及解决
- [Tips] WSL ubuntu 18.04 安装python3
- python集合类型中的元素是有序的_python基础篇:很有意思的数据类型,集合(set) 常用去去重...
- Java并发 乐观锁和悲观锁 乐观锁的一种实现方式CAS
- 在XCode工程中创建bundle文件
- Fragment学习(二): 管理Fragment和Fragment通讯
- 资深码农教你写详细设计(附示例模板)
- I2C总线与EPPROM
- Ubuntu18.04: Git clone 时出现gnutls_handshake() failed: The TLS connection was non-properly terminated
- [置顶] 可惜了,没有人可以代替你自己的思考
- 【图】max51开发板(手工焊接)
- iscc2022弱雪wp
- group normalization
- mtatlas mysql_MHA-Atlas-MySQL高可用(下)
热门文章
- 使用OpenCV的ANN_MLP神经网络实现数字识别
- OpneCV3特征提取及匹配SURF算法(一)——SURF概述与代码演示
- VS2010解决方案位置不对和改变程序字体的方案
- php post请求后端拿不到值_[精选] uniapp实现多端开发,与PHP是如何结合的
- python输入一组数据、进行简单的统计_《利用Python进行数据分析》学习笔记——第二章(3)...
- c语言平滑raw图像(取平均值法)
- Spring Boot 2.0(四):使用 Docker 部署 Spring Boot
- 团队作业第二次—项目选题报告(追光的人)
- P4568 [JLOI2011]飞行路线 P2939 [USACO09FEB]改造路Revamping Trails
- JS特效 -- 网页图片飞起来