在处理项目中的数据传输和处理时,选择合适的数据存储格式至关重要。传统的CSV文件格式在数据量不大时表现尚可,但随着数据量的增加,其存储和加载数据的过程变得缓慢,导致数据处理效率降低。因此,寻找更高效的数据存储格式成为了一个迫切的需求。
Feather格式作为一种轻量级的二进制数据存储格式,以其快速和便携的特性,逐渐成为数据存储的新选择。Feather利用Apache Arrow的列式内存规范来表示磁盘上的二进制数据,这大大加快了读写操作的速度。特别是对于编码空值/NA值和具有可变长度的类型(如UTF8字符串)来说,Feather格式的优势更为明显。
Feather格式不仅仅局限于Python和R这两种编程语言,它可以被任何主流编程语言所使用。虽然Feather的原始目标是促进R和Python脚本之间的数据交换,以及一般性的短期存储,但没有人阻止将这些文件保存到磁盘上并遗忘它们多年,尽管有更高效的格式可供选择。
在Python中,可以通过Pandas库或独立的Feather库来使用Feather格式。以下是如何在Python中安装和使用Feather格式的步骤。
pip install feather-format
在R中,可以使用以下命令安装Feather格式:
install.packages("feather")
以下是如何在Python中使用Feather格式的基本步骤:首先加载所需的库,然后生成一个包含七列和一千万行随机数的大型数据集。
import feather
import numpy as np
import pandas as pd
# np.random.seed = 40
print("something")
df_size = 1000
dataf = pd.DataFrame({
'a': np.random.rand(df_size),
'b': np.random.rand(df_size),
'c': np.random.rand(df_size),
'd': np.random.rand(df_size),
'e': np.random.rand(df_size),
'f': np.random.rand(df_size),
'g': np.random.rand(df_size)
})
print(dataf.head())
接下来,将数据集保存到本地。使用Pandas将DataFrame保存为Feather格式的命令如下:
dataf.to_feather('one_million.feather')
使用Feather库保存数据的方式如下:
feather.write_dataframe(dataf, 'one_million.feather')
两种方法之间没有太大的区别,现在两个文件都已存储在本地。可以使用Pandas或专门的Feather库来读取它们。以下是使用Pandas语法读取Feather文件的方法:
df = pd.read_feather('one_million.feather')
如果使用的是Feather库,可以将其更改为:
df = feather.read_dataframe('one_million.feather')
Feather格式支持多种数据类型,包括逻辑或布尔值、有限范围的因子/分类变量、UTF-8编码的字符串、多种数值类型(int8, int16, int32, int64, uint8, uint16, uint32, uint64, float, double)、任意二进制数据、日期、时间和时间戳。
Feather格式与CSV格式相比,在文件大小、读取时间和写入时间上都有显著的优势。以下是Feather格式与CSV格式的性能对比数据:
CSV (Pandas) 本地保存时间(秒) - 35.6秒
Feather (Pandas) 本地保存时间(秒) - 0.289秒
原生Feather本地保存时间(秒) - 0.235秒
这表明原生Feather的保存速度是CSV的150倍。无论是使用Pandas还是原生Feather,与CSV相比,速度提升都是巨大的。
接下来,来看读取时间,即读取相同数据集在不同格式下所需的时间:
CSV (Pandas) 本地读取时间(秒) - 3.85秒
Feather (Pandas) 本地读取时间(秒) - 0.472秒
原生Feather本地读取时间(秒) - 0.326秒
再次出现了巨大的差异。CSV文件占用的磁盘空间更多,具体来说:
CSV (Pandas) 文件大小 - 963.5 MB
Feather (Pandas) 文件大小 - 400.1 MB
原生Feather文件大小 - 400.1 MB