当前位置: 首页 > news >正文

全网最全文件格式详解:npy/npz/h5/hdf5/pkl/hdf/tfrecord/parquet/csv/txt/feather

文章目录

    • 一. 简介/优缺点/使用场景
        • 1. NPY (NumPy Array)
        • 2. NPZ (NumPy Zip)
        • 3. H5/HDF5 (Hierarchical Data Format)
        • 4. PKL (Pickle)
        • 5. HDF (Hierarchical Data Format)
        • 6. TFRecord
        • 7. Parquet
        • 8. CSV (Comma-Separated Values)
        • 9. TXT (Text File)
        • 10. Feather
    • 二、性能测试
        • 性能测试结果:
        • 测试代码:

在数据科学和机器学习领域,选择合适的文件格式来存储和读取数据是至关重要的。不同的文件格式各有优缺点,适用于不同的应用场景,读取速度和空间占用大小也各有不同。以下将对几种常见文件格式及其介绍:

一. 简介/优缺点/使用场景

1. NPY (NumPy Array)

简介
NPY 是 NumPy 的专有二进制格式,专门用于存储 NumPy 数组。

优点

  • 快速读写:读写速度较快,适合大量数值数据。
  • 直接支持多维数组:能够存储多维数组及其数据类型。

缺点

  • 可移植性差:仅适用于 Python 和 NumPy 环境,其他语言或库不易读取。

适用场景: 适合科学计算、数据分析和深度学习模型的中间数据存储。

2. NPZ (NumPy Zip)

简介
NPZ 是 NPY 格式的压缩版本,支持多个数组的存储。

优点

  • 多数组存储:可以将多个 NumPy 数组存储在一个文件中。
  • 压缩存储:比 NPY 文件更小,节省存储空间。

缺点

  • 读取速度较 NPY 略慢:因为需要解压缩。

适用场景: 适合需要存储多个 NumPy 数组的场合,尤其是在数据体积较大时。

3. H5/HDF5 (Hierarchical Data Format)

简介
HDF5 是一种开放的文件格式,支持存储大量和复杂的数据。

优点

  • 支持大数据集:可处理 TB 级别的数据,支持分层结构。
  • 跨平台:可在多种语言和平台上使用(Python, C++, Java等)。

缺点

  • 学习曲线:API 相对复杂,初学者可能需要一些时间适应。

适用场景: 适合需要处理大规模科学数据、深度学习模型训练和多维数据分析的场合。

4. PKL (Pickle)

简介
Pickle 是 Python 的序列化模块,用于将 Python 对象存储为二进制格式。

优点

  • 简单易用:直接存储和加载 Python 对象。
  • 支持多种数据类型:可以保存几乎所有 Python 对象,包括列表、字典、类实例等。

缺点

  • 可移植性差:仅适用于 Python,其他语言无法直接读取。
  • 安全性:读取来自不可信源的 Pickle 文件时可能存在安全风险。

适用场景: 适合存储 Python 数据结构,尤其是在模型训练完成后需要保存模型时。

5. HDF (Hierarchical Data Format)

简介
与 HDF5 类似,HDF 是一种较旧的文件格式,支持多种数据类型。

优点

  • 数据结构清晰:支持复杂的数据组织方式。

缺点

  • 不如 HDF5 高效:在处理大数据时性能较差。

适用场景: 一般用于科学研究中,特别是一些老旧系统中。

6. TFRecord

简介
TFRecord 是 TensorFlow 的数据格式,适用于 TensorFlow 处理的大规模数据。

优点

  • 适合大规模数据处理:可以高效地读取和写入。
  • 支持流式读取:适合训练大型模型。

缺点

  • 格式专有:主要用于 TensorFlow,不适合其他框架。

适用场景: 适合机器学习和深度学习中的训练数据存储,特别是在使用 TensorFlow 时。

7. Parquet

简介
Parquet 是一种列式存储格式,优化了大数据处理的性能。

优点

  • 列式存储:可以更高效地读取和压缩数据。
  • 跨平台:与多种大数据工具(如 Spark, Hive)兼容。

缺点

  • 对小型数据集不适合:对于小数据集,读取速度可能不如行式存储。

适用场景: 适合数据仓库和大数据分析,尤其是在处理大规模数据时。

8. CSV (Comma-Separated Values)

简介
CSV 是一种常用的文本文件格式,以逗号分隔数据。

优点

  • 简单易读:人类可读,易于理解和编辑。
  • 广泛支持:几乎所有的数据处理工具和编程语言都支持。

缺点

  • 不支持复杂数据:无法存储嵌套结构或多维数组。
  • 读写速度较慢:尤其是在处理大数据时。

适用场景: 适合小型数据集的存储和处理,尤其是在数据交换和共享时。

9. TXT (Text File)

简介
TXT 是一种简单的文本文件格式,通常以纯文本形式存储数据。

优点

  • 易于创建和修改:几乎所有的文本编辑器都能处理。
  • 可读性高:人类可读,便于调试。

缺点

  • 数据类型限制:不支持数据类型信息,容易导致误解。
  • 不适合结构化数据:对于复杂数据结构支持不足。

适用场景: 适合日志文件、配置文件或简单的数据存储。

10. Feather

简介
Feather 是一种列式存储格式,旨在快速读写数据。

优点

  • 高性能:读取和写入速度极快,适合大数据量处理。
  • 跨语言支持:兼容 Python 和 R。

缺点

  • 主要用于中间存储:不适合长期存储。

适用场景: 适合快速数据交换,尤其是在数据分析和机器学习工作流程中。

二、性能测试

Step1: 数据准备:

  • 生成一个大规模的随机数据集,可以使用NumPy创建一个大的二维数组。

Step2: 读写操作:

  • 对每种文件格式进行5次写入和读取操作,每次读写都进行缓存清除,记录所需时间和文件大小。

Step3: 性能测量:

  • 使用Python的time模块测量写入和读取的时间。
  • 使用os.path.getsize()获取文件的大小。

Step4: 数据记录:

  • 创建一个数据结构(如字典或DataFrame)来存储每种格式的读写时间和文件大小。

Step5: 绘图:

  • 使用Matplotlib或Seaborn绘制折线图,分别展示读取速度、写入速度和存储空间的对比。
性能测试结果:

读写速度比较:
在这里插入图片描述
存储空间占用大小比较:
在这里插入图片描述
从结果来看,npy、npz、h5的性能相对更优;
但从可读性来说,csv和txt更优,毕竟电脑可以直接打开阅读,其他文件格式都需要使用代码或者特定的文件编辑器打开。

测试代码:
import numpy as np
import pandas as pd
import os
import time
import h5py
import pickle
import pyarrow as pa
import pyarrow.feather as feather
import pyarrow.parquet as pq
import matplotlib.pyplot as pltdef write_h5(file_path, data):with h5py.File(file_path, 'w') as f:f.create_dataset('data', data=data)def test_read_write(file_path, write_func, read_func):# 写入start_time = time.time()write_func()write_time = time.time() - start_timeos.sync()  # 刷新缓存# 读取start_time = time.time()read_func()read_time = time.time() - start_timeos.sync()  # 刷新缓存# 文件大小file_size = os.path.getsize(file_path) / (1024 * 1024)  # 转换为 MBreturn {'write_time': write_time, 'read_time': read_time, 'size': file_size}def run_experiments(n=5):# 生成数据data = np.random.rand(10000, 1000)df = pd.DataFrame(data)# 文件路径file_paths = {'npy': 'data.npy','npz': 'data.npz','h5': 'data.h5','pkl': 'data.pkl','csv': 'data.csv','txt': 'data.txt','feather': 'data.feather','parquet': 'data.parquet',}# 写入函数formats = {'npy': lambda: np.save(file_paths['npy'], data),'npz': lambda: np.savez(file_paths['npz'], data=data),'h5': lambda: write_h5(file_paths['h5'], data),'pkl': lambda: df.to_pickle(file_paths['pkl']),'csv': lambda: df.to_csv(file_paths['csv'], index=False),'txt': lambda: np.savetxt(file_paths['txt'], data),'feather': lambda: feather.write_feather(df, file_paths['feather']),'parquet': lambda: pq.write_table(pa.Table.from_pandas(df), file_paths['parquet']),}results = {fmt: {'write_time': [], 'read_time': [], 'size': []} for fmt in formats}# 执行N次实验for i in range(n):print(f"第 {i} 次执行开始")for fmt, writer in formats.items():read_func = Noneif fmt == 'npy':read_func = lambda: np.load(file_paths['npy'])elif fmt == 'npz':read_func = lambda: np.load(file_paths['npz'])elif fmt == 'h5':read_func = lambda: h5py.File(file_paths['h5'], 'r')['data'][:]elif fmt == 'pkl':read_func = lambda: pd.read_pickle(file_paths['pkl'])elif fmt == 'csv':read_func = lambda: pd.read_csv(file_paths['csv'])elif fmt == 'txt':read_func = lambda: np.loadtxt(file_paths['txt'])elif fmt == 'feather':read_func = lambda: feather.read_feather(file_paths['feather'])elif fmt == 'parquet':read_func = lambda: pq.read_table(file_paths['parquet']).to_pandas()res = test_read_write(file_paths[fmt], writer, read_func)results[fmt]['write_time'].append(res['write_time'])results[fmt]['read_time'].append(res['read_time'])results[fmt]['size'].append(res['size'])# 计算平均值,增强可信度avg_results = {}for fmt in results:avg_results[fmt] = {'avg_write_time': np.mean(results[fmt]['write_time']),'avg_read_time': np.mean(results[fmt]['read_time']),'avg_size': np.mean(results[fmt]['size']),}# 绘制结果df_avg_results = pd.DataFrame(avg_results).Tplt.figure(figsize=(12, 6))# 绘制写入时间plt.plot(df_avg_results.index, df_avg_results['avg_write_time'], marker='o', label='Average Write Time', color='blue')for i, write_time in enumerate(df_avg_results['avg_write_time']):plt.annotate(f"{write_time:.2f}", (df_avg_results.index[i], write_time), textcoords="offset points", xytext=(0,10), ha='center')# 绘制读取时间plt.plot(df_avg_results.index, df_avg_results['avg_read_time'], marker='o', label='Average Read Time', color='green')for i, read_time in enumerate(df_avg_results['avg_read_time']):plt.annotate(f"{read_time:.2f}", (df_avg_results.index[i], read_time), textcoords="offset points", xytext=(0,-10), ha='center')plt.title('Average Read/Write Time Comparison')plt.xlabel('File Format')plt.ylabel('Time (seconds)')plt.xticks(rotation=45)plt.grid()plt.legend()plt.savefig('read_write_time_comparison.jpg', format='jpg', bbox_inches='tight')plt.close()  # 关闭图形以释放内存# 绘制文件大小plt.figure(figsize=(12, 6))plt.plot(df_avg_results.index, df_avg_results['avg_size'], marker='o', color='orange', label='Average Size (MB)')for i, size in enumerate(df_avg_results['avg_size']):plt.annotate(f"{size:.2f} MB", (df_avg_results.index[i], size), textcoords="offset points", xytext=(0,10), ha='center')plt.title('Average File Size Comparison')plt.xlabel('File Format')plt.ylabel('Size (MB)')plt.xticks(rotation=45)plt.grid()plt.legend()plt.savefig('file_size_comparison.jpg', format='jpg', bbox_inches='tight')plt.close()  # 关闭图形以释放内存# 调用实验
run_experiments(n=5)

本文完结!


http://www.mrgr.cn/news/57970.html

相关文章:

  • (gersemi) CMake 格式化工具
  • Halcon基础-瓶盖带角度的OCR批量识别
  • 融合ASPICE与敏捷开发:探索汽车软件开发的最佳实践
  • 灵活如风:全面掌握动态新增 SQL Server 对象的实用指南
  • vue3可组合函数和hook的用法和使用场景区别
  • Linux云计算 |【第五阶段】ARCHITECTURE-DAY4
  • 记录一次线上环境svchost.exe antimalware service executable 进程占用CPU过高问题
  • 如何轻松攻克Lua语法基础?教程在此(下篇)
  • 今日总结10.24
  • Flutter 状态管理框架Get
  • 最优阵列处理技术(七)-谱加权
  • 【ADC】FFT分析中的基本概念与相干采样
  • 20241024-LaTeX常用数学符号之希腊字母——Typora(2)
  • GISBox vs CesiumLab:哪款GIS工具更适合你的项目?
  • 基于Matlab 火焰识别技术
  • 【博客节选】Unity角色异常抖动问题排查
  • make和makefile
  • 文件操作(1) —— 文件基础知识
  • 当并发控制遇上餐厅!让你彻底搞懂MySQL脏读、不可重复读、幻读和丢失更新
  • ppt怎么一键抠图?3个实用技巧,轻松做出高颜值PPT!
  • 时序知识图谱学习——思维框图总结
  • 力扣 —— 分发糖果
  • geoserver解析元数据获取图层相关参数
  • 零基础Java第九期:一维数组(二)和二维数组
  • Java题集练习3
  • 一文带你入门Flink CDC