【发布时间】:2014-01-04 07:01:15
【问题描述】:
我正在使用具有数百万行和 100 多列的 Oracle 数据库。我正在尝试使用带有索引的某些列的 pytables 将此数据存储在 HDF5 文件中。我将在 pandas DataFrame 中读取这些数据的子集并执行计算。
我尝试了以下方法:
使用实用程序将表下载到 csv 文件中,使用 pandas 逐块读取 csv 文件,并使用 pandas.HDFStore 附加到 HDF5 表。我创建了一个 dtype 定义并提供了最大字符串大小。
但是,现在当我尝试直接从 Oracle DB 下载数据并通过 pandas.HDFStore 将其发布到 HDF5 文件时,我遇到了一些问题。
pandas.io.sql.read_frame 不支持分块读取。我没有足够的 RAM 来先将整个数据下载到内存中。
如果我尝试将cursor.fecthmany() 与固定数量的记录一起使用,则读取操作在未编制索引的数据库表中需要很长时间,我必须读取日期范围内的记录。我正在使用DataFrame(cursor.fetchmany(), columns = ['a','b','c'], dtype=my_dtype)
但是,创建的 DataFrame 总是推断 dtype 而不是强制执行我提供的 dtype(与 read_csv 坚持我提供的 dtype 不同)。因此,当我将此 DataFrame 附加到已经存在的 HDFDatastore 时,例如存在类型不匹配。一个 float64 可能会在一个块中解释为 int64。
如果你们能提出你的想法并为我指明正确的方向,不胜感激。
【问题讨论】:
-
您当前的方法(使用 csv)和 dtype 校正是正确的。 SQL 将在 0.14 中获得重大更新(0.13 即将发布)。所以不幸的是 dtype 推理/分块不可用。不过欢迎 PRS!看到这个问题:github.com/pydata/pandas/issues/4163
-
我建议删除 Oracle 标记,除非您在 Oracle 方面遇到任何问题。
-
您应该要求您的 dba 将表转换为范围分区对象,之后应该很容易通过分区访问
-
如果您不将所有数据导出到单个 CSV 文件,而只是将该文件分成几位,这难道不能解决问题吗?如果您必须定期执行此工作,这也将减少空间需求和运行时间,如果 Oracle 导出一个接一个地导出一个小 CSV,而 HDF5 进程并行导入它们,删除完成的文件...
标签: python pandas hdf5 pytables