从Oracle读取包含数百万行的大表并写入HDF5

sma*_*ert 11 python hdf5 pytables pandas

我正在使用具有数百万行和100多列的Oracle数据库.我试图使用带有索引的某些列的pytables将这些数据存储在HDF5文件中.我将在pandas DataFrame中读取这些数据的子集并执行计算.

我尝试过以下方法:

下载表,使用实用程序到csv文件,使用pandas通过chunk读取csv文件块并使用附加到HDF5表pandas.HDFStore.我创建了一个dtype定义并提供了最大的字符串大小.

但是,现在当我尝试直接从Oracle DB下载数据并将其发布到HDF5文件时pandas.HDFStore,我遇到了一些问题.

pandas.io.sql.read_frame不支持分块读取.我没有足够的RAM能够先将整个数据下载到内存中.

如果我尝试使用cursor.fecthmany()固定数量的记录,那么DB表中的读取操作需要很长时间才能被索引,我必须读取属于日期范围的记录.但是我使用的DataFrame(cursor.fetchmany(), columns = ['a','b','c'], dtype=my_dtype) 是,创建的DataFrame总是推断dtype而不是强制执行我提供的dtype(与read_csv不同,它遵循我提供的dtype).因此,当我将此DataFrame附加到已存在的时HDFDatastore,存在类型不匹配,例如,float64可能在一个块中被解释为int64.

如果你们能提出你的想法并指出我正确的方向,那就表示赞赏.

mrk*_*afk 1

好吧,目前唯一实用的解决方案是直接使用 PyTables,因为它是为内存不足操作而设计的......这有点乏味,但也没有那么糟糕:

http://www.pytables.org/moin/HintsForSQLUsers#Insertingdata

另一种方法是使用 Pandas,如下:

使用 pandas 的“大数据”工作流程