python - 将大型数据集加载到 python 中的最快方法
问题描述
我有一些相对较大的 .mat 文件正在读入 Python 以最终在 PyTorch 中使用。这些文件的行数不等(~55k 到~111k),但每个都有不到 11k 列,没有标题,所有条目都是浮点数。数据文件大小范围从 5.8 GB 到 11.8 GB。.mat 文件来自 Perl 中先前的数据处理步骤,所以我不确定 mat 版本;当我尝试使用 加载文件时scipy.io.loadmat
,收到以下错误:ValueError: Unknown mat file type, version 46, 56
. 我试过pandas
,dask
和astropy
并且成功了,但是加载单个文件需要 4-6 分钟。这是使用我上面提到的每种方法加载的代码,作为计时实验运行:
import pandas as pd
import dask.dataframe as dd
from astropy.io import ascii as aio
import numpy as np
import time
numberIterations = 6
daskTime = np.zeros((numberIterations,), dtype=float)
pandasTime = np.zeros((numberIterations,), dtype=float)
astropyTime = np.zeros(numberIterations,), dtype=float)
for ii in range(numberIterations):
t0 = time.time()
data = dd.read_csv(dataPath, delimiter='\t', dtype=np.float64, header=None)
daskTime[ii] = time.time() - t0
data = 0
del(data)
t0 = time.time()
data = pd.read_csv(dataPath, delimiter='\t', dtype=np.float64, header=None)
pandasTime[ii] = time.time() - t0
data = 0
del(data)
t0 = time.time()
data = aio.read(dataPath, format='fast_no_header', delimiter='\t', header_start=None, guess=False)
astropyTime[ii] = time.time() - t0
data = 0
del(data)
当我对这些方法计时时,dask
是迄今为止最慢的(几乎是 3 倍),其次是pandas
,然后是astropy
. 对于最大的文件,6 次运行的加载时间(以秒为单位)为:
dask: 1006.15 (avg), 1.14 (std)
pandas: 337.50 (avg), 5.84 (std)
astropy: 314.61 (avg), 2.02 (std)
我想知道是否有更快的方法来加载这些文件,因为这仍然很长。具体来说,我想知道是否有更好的库可用于一致加载表格浮点数据和/或是否有一种方法可以合并 C/C++ 或 bash 以更快地读取文件。我意识到这个问题有点开放。我希望对如何更快地读取这些文件有一些想法,因此不会浪费大量时间来读取文件。
解决方案
鉴于这些是在 中生成的perl
,并且上面的代码有效,这些是制表符分隔的文本文件,而不是 matlab 文件。哪个适合scipy.io.loadmat
.
通常,文本读取速度很慢,并且很大程度上取决于压缩和 IO 限制。
FWIW pandas 在底层已经得到了很好的优化,我怀疑你会从直接使用 C 中获得显着的收益。
如果您打算经常使用这些文件,则可能值得使用zarr
或hdf5
表示表格浮点数据。zarr
如果您已经有一些经验,我会倾向于dask
。他们一起工作得很好。
推荐阅读
- apache-nifi - NiFi 1.5.0 : GenerateTableFetch 订单结果
- c# - .NET Core 项目中的 System.Automation.Runspaces 错误
- mysql - 在 Django 中使用 GROUP_CONCAT 和其他注释
- javascript - 计算数组中的组合产品
- python - 从python中的dicom文件获取z-buffer(深度)信息
- c++ - 如何在对象数组中打印对象的变量
- ruby-on-rails - ActiveRecord::Base.connected?即使 DB 关闭也返回 true
- php - 将实体传递给 Form 时的 TransformationFailedException
- windows-installer - MSP 安装期间出现错误 1603
- arrays - 自适应排序算法与排序网络对 32 个随机元素的列表进行排序