热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

cfilefile读写最大文件_轻如“鸿毛(Feather)”的文件格式却重于泰山

前言数据分析常用的数据格式无非就是json,txt,csv,excel或者是数据库文件,他们各有所长。其中用处最广泛的应属于

前言

数据分析常用的数据格式无非就是json,txt,csv,excel 或者是数据库文件,他们各有所长。其中用处最广泛的应属于csv,因为它轻量,占用的空间相比于excel会小很多。它的可读性也不错,相比于txt 更适合数据分析,尤其是基于pandas的数据分析。

今天我们推荐一个日常中,小众但是很实用的文件格式 --Feather,一句话定位它​:高速读写压缩二进制文件​。​

Feather 介绍

Feather 其实是Apache Arrow 项目中包含的一种数据格式,但是由于其优异的性能,该文件格式也被单独打包,放在pip中进行安装。Pandas 也支持对Feather的读写,所以只需安装pandas即可。

官方介绍Feather是一款高速,轻量,易于使用的二进制文件格式,用于保存数据。它在设计时尽可能让API函数简单,而且优化了读写速度。

官方链接:Feather File Format

Pandas保存Feather 格式

秉承Feather的设计原则,Pandas 对于Feather的读写也保持API函数极简。Pandas 中写Feather 只有一个函数:

DataFrame.to_feather(**kwargs)

参数主要的有三个:

  • path: 需要保存的Feather文件路径
  • compression: 是否压缩,以及如何压缩,支持{'zstd', 'uncompressed', 'lz4'} 三个选项
  • compression_level:压缩水平,注意lz4 不支持该参数

我们采用Uber数据集来进行测试。调用to_feather 函数将读取的dataframe保存为feather文件。​这里我们采用不同的压缩格式进行保存。

import pandas as pd
import os
import time
csv_file = 'uber_raw.csv'
csv_df = pd.read_csv(csv_file)
feather_file = 'uber.feather'
csv_df.to_feather(feather_file)# save df to feather
compressed_file = 'compressed.feather'
csv_df.to_feather(compressed_file,compression ='zstd',compression_level =2)

​我们通过os 来获取文件的大小,并且对比原始文件计算压缩率

print_file_size(csv_file)
print_file_size(feather_file)
print_file_size(compressed_file)
standard_ratio = os.stat(feather_file).st_size/os.stat(csv_file).st_size
print(f'standard feather compression ratio is {standard_ratio*100 :.1f}%')
non_standard_ratio = os.stat(compressed_file).st_size/os.stat(csv_file).st_size
print(f'non_standard feather compression ratio is {non_standard_ratio*100 :.1f}%')

结果如下。 可以看到Feather相比于csv文件,占用的容量显著减少,压缩率可以达到22% 左右(压缩率越小越好)

[uber_raw.csv] file size is 45.34 MB
[uber.feather] file size is 16.07 MB
[compressed.feather] file size is 10.30 MB
standard feather compression ratio is 35.4%
non_standard feather compression ratio is 22.7%

Feather文件读取性能测试

Pandas 读取Feather文件也很简单,read_feather即可。位置参数为文件的路径,可选参数columns用于指定需要读取哪些列

pandas.read_feather(path, columns=None, use_threads=True)

Feather可以显著压缩文件,压缩后的文件读取是否会慢呢?是否需要先解压呢?我们同样将csv和Feather进行读取性能测试。代码很简单,多次读取,比如20次,然后统计每次读取的耗时。

start_epco = time.time()
n_loops = 20
for i in range(n_loops):csv_df = pd.read_csv(csv_file)
csv_time_usage = (time.time() - start_epco)/n_loops
print(f'csv file read time usage is {csv_time_usage :.2f} s')start_epco = time.time()
n_loops = 20
for i in range(n_loops):feather_df = pd.read_feather(feather_file)
f_time_usage = (time.time() - start_epco)/n_loops
print(f'feather file read time usage is {f_time_usage :.2f} s')
print(f'feather time usage / csv time usage = {f_time_usage/csv_time_usage*100 :.1f}%')

对比结果如下,我们可以看到,Feather的读取耗时不到csv的耗时的1/3

csv file read time usage is 0.54 s
feather file read time usage is 0.15 s
feather time usage / csv time usage = 28.5%

Feather的正确用途

可以看到,Feather 相比于csv在性能上有明显的优势:

  • 它适合于中型数据(GB为单位的数据),比如4GB的csv文件,可能只占用700M feather 文件,亲测
  • 读写速度远胜于csv,而且相比于数据库又具有便携的优势,可以作为很好的中间媒介来传输数据,比如从某个大型数据库中导出部分数据,这也是我常用的方式。
  • 类似于csv,Feather也支持从源文件中仅仅读取所需的列,这样可以减少内存的使用。​这对于中型数据(GB)分析是非常有用的。比如本文中的案例,可以仅仅读取前三列数据。

partial_df = pd.read_feather(path=feather_file,columns=["Date/Time","Lat","Lon"])

缺点嘛,作者在发布V1时,不建议将Feather作为长期的保存格式,因为他觉得以后功能更会有变换,但是目前feather已经更新到V2版本,依然很稳定。

综上所述,Feather 值得一试,尤其是项目实践中作为​中间载体。



推荐阅读
author-avatar
手机用户2602920263
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有