将大型数据集加载到Python中的最快方法

问题描述 投票:0回答:2

我有一些相对较大的 .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 来更快地读取文件。我意识到这个问题有点开放性;我希望获得一些关于如何更快地读取这些文件的想法,这样就不会在读取文件上浪费大量时间。

python pandas astropy mat-file data-ingestion
2个回答
2
投票

鉴于这些是在

perl
中生成的,并且考虑到上面的代码有效,这些是制表符分隔的文本文件,而不是 matlab 文件。这适合
scipy.io.loadmat

一般来说,读取文本很慢,并且在很大程度上取决于压缩和 IO 限制。

FWIW pandas 已经在底层进行了很好的优化,我怀疑直接使用 C 是否会获得显着的收益。

如果您打算经常使用这些文件,则可能值得使用

zarr

hdf5
 来表示表格浮点数据。如果您已经有一些使用 
zarr
 的经验,我会倾向于 
dask
。他们合作得很好。


0
投票
Pandas 的速度还不如其他格式。熊猫非常非常慢。我不知道另一个答案在说什么。我从 Pandas 切换到 Numpy 二进制文件就从 3 个多小时缩短到 3 分钟。对您来说最简单的实现是使用 numpy 二进制文件并使用 numba 进行任何计算。 Numba 使用 C++ 后端来执行 for 循环等代码。我尝试了许多不同的格式,对于大多数数据集来说,读入内存或使用内存映射仍然比使用 Dask 之类的东西更快,尽管我的数据集不超过 10GB 并且我有空闲内存。

© www.soinside.com 2019 - 2024. All rights reserved.