【问题标题】:Fastest method for loading large dataset into python将大型数据集加载到 python 中的最快方法
【发布时间】:2021-11-12 10:41:38
【问题描述】:

我有一些相对较大的 .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 以更快地读取文件。我意识到这个问题有点开放。我希望对如何更快地读取这些文件有一些想法,因此不会浪费大量时间来读取文件。

【问题讨论】:

  • 您首先测量的是哪一个?你的机器有多少内存?
  • 我按照给出的顺序测量了它们。但是,我确实在每次读取之间删除了数据变量,因此代码更接近data = read(dataPath ...); del(data)。这台机器有 64 GB RAM。
  • 按相反的顺序尝试。磁盘缓存可以产生很大的不同
  • 我不认为这真的是个问题。我的意思是,我在 for 循环中运行它,所以在使用 astropy 读入数据后,数据被删除,然后使用 dask 再次读入。因此,虽然第一次迭代的顺序是dask、pandas、astropy,但在第一次循环之后,顺序大部分都消失了。

标签: python pandas astropy mat-file data-ingestion


【解决方案1】:

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

通常,阅读文本 很慢,并且很大程度上取决于压缩和 IO 限制。

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

如果您打算经常使用这些文件,则可能值得使用zarr 或hdf5 来表示表格浮点数据。如果您已经对dask 有一些经验,我会倾向于zarr。他们一起工作得很好。

【讨论】:

  • 我不认为转换这些文件是值得的,因为perl 程序将成为管道的一部分。因此,我的代码将摄取 perl 程序的输出。就阅读而言,我已经看到使用bash 可能是有益的提示。例如,bash 中的readarray 只需几秒钟,但我不知道如何将结果传递给 python...
  • 您是否可以控制写入这些文件的管道部分?如果它们一开始就以二进制格式编写会更好。这还取决于您正在执行哪种处理。您可以将文件分成更小的块还是必须将其全部读入内存?
  • perl 支持 HDF5,如果这是一个选项的话。
猜你喜欢
  • 2015-10-31
  • 2017-11-16
  • 1970-01-01
  • 1970-01-01
  • 2016-12-28
  • 1970-01-01
  • 1970-01-01
  • 2012-12-31
  • 2014-12-12
相关资源
最近更新 更多