我有一些相对较大的.mat文件,我正在将这些文件读入Python中,以便最终在PyTorch中使用。这些文件的行数不等(~55k到~11k),但每个文件都有不到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文件。这将适用于CCD_ 10。
通常,文本中的阅读速度较慢,并且在很大程度上取决于压缩和IO限制。
FWIWpandas已经在引擎盖下进行了很好的优化,我怀疑你是否会从直接使用C中获得显著的收益。
如果您计划经常使用这些文件,则可能值得使用zarr
或hdf5
来表示表格浮动数据。如果你已经对dask
有一些经验,我会倾向于zarr
。他们合作得很好。