8

我最近遇到了 Pytables,发现它非常酷。很明显,对于非常大的数据集,它们优于 csv 格式。我正在使用 python 运行一些模拟。输出不是那么大,比如 200 列和 2000 行。

如果有人对这两种方法都有经验,您能否建议从长远来看,对于此类不是很大的数据集,哪种格式更方便。Pytables 具有数据操作功能和使用 Vitables 浏览数据的功能,但浏览器没有可用于 CSV 的 Excel 等功能。同样,如果主要在 python 中工作,您是否发现其中一种在导入和导出数据方面比另一种更好?在文件组织方面更方便吗?对此类问题的任何评论都会有所帮助。

谢谢。

4

6 回答 6

6

你考虑过 Numpy 数组吗?

当您的数据太大而无法放入内存时,PyTables 非常棒,但是 8 字节浮点数的 200x2000 矩阵只需要大约 3MB 的内存。所以我认为 PyTables 可能有点矫枉过正。

np.savetxt您可以使用or (用于压缩)将 numpy 数组保存到文件中,并且可以使用ornp.savez从文件中读取它们。np.loadtxtnp.load

如果您有许多这样的数组要存储在磁盘上,那么我建议使用数据库而不是 numpy.npz文件。顺便说一句,要在数据库中存储一个 200x2000 的矩阵,您只需要 3 个表列:行、列、值:

import sqlite3
import numpy as np

db = sqlite3.connect(':memory:')
cursor = db.cursor()
cursor.execute('''CREATE TABLE foo
                  (row INTEGER,
                   col INTEGER,
                   value FLOAT,
                   PRIMARY KEY (row,col))''')
ROWS=4
COLUMNS=6
matrix = np.random.random((ROWS,COLUMNS))
print(matrix)
# [[ 0.87050721  0.22395398  0.19473001  0.14597821  0.02363803  0.20299432]
#  [ 0.11744885  0.61332597  0.19860043  0.91995295  0.84857095  0.53863863]
#  [ 0.80123759  0.52689885  0.05861043  0.71784406  0.20222138  0.63094807]
#  [ 0.01309897  0.45391578  0.04950273  0.93040381  0.41150517  0.66263562]]

# Store matrix in table foo
cursor.executemany('INSERT INTO foo(row, col, value) VALUES (?,?,?) ',
                   ((r,c,value) for r,row in enumerate(matrix) 
                                for c,value in enumerate(row)))

# Retrieve matrix from table foo
cursor.execute('SELECT value FROM foo ORDER BY row,col')
data=zip(*cursor.fetchall())[0]
matrix2 = np.fromiter(data,dtype=np.float).reshape((ROWS,COLUMNS))
print(matrix2)
# [[ 0.87050721  0.22395398  0.19473001  0.14597821  0.02363803  0.20299432]
#  [ 0.11744885  0.61332597  0.19860043  0.91995295  0.84857095  0.53863863]
#  [ 0.80123759  0.52689885  0.05861043  0.71784406  0.20222138  0.63094807]
#  [ 0.01309897  0.45391578  0.04950273  0.93040381  0.41150517  0.66263562]]

如果你有很多这样的 200x2000 矩阵,你只需要一个表格列来指定哪个矩阵。

于 2010-10-26T13:05:30.410 回答
2

就导入/导出而言,PyTables 使用称为HDF5的标准化文件格式。许多科学软件包(如 MATLAB)都内置了对 HDF5 的支持,而且 C API 并不糟糕。因此,您需要从其中一种语言中导出或导入的任何数据都可以简单地保存在 HDF5 文件中。

PyTables 确实添加了一些它自己的属性,但这些不应该伤害你。当然,如果您将 Python 对象存储在文件中,您将无法在其他地方读取它们。

CSV 文件的一个好处是它们是人类可读的。但是,如果您需要在其中存储除简单数字以外的任何内容并与他人交流,您就会遇到问题。我从其他组织的人那里收到 CSV 文件,我注意到人类并不擅长确保正确完成字符串引用之类的事情。Python 的 CSV 解析器与它一样灵活,这很好。另一个问题是浮点数不能以十进制格式精确存储在文本中。不过,它通常已经足够好了。

于 2010-10-26T11:19:23.657 回答
2

PyTables 的一大优点是存储元数据,如变量等。如果您使用不同的参数更频繁地运行模拟,您可以将结果作为数组条目存储在 h5 文件中。

我们用它来存储测量数据+实验脚本来获取数据,所以它都是自包含的。

顺便说一句:如果您需要快速查看 hdf5 文件,您可以使用 HDFView。这是 HDFGroup 提供的免费 Java 应用程序。它很容易安装。

于 2011-10-13T11:20:38.970 回答
1

我认为很难比较 pytables 和 csv .. pyTable 是一种数据结构,而 CSV 是一种数据交换格式。

于 2010-10-26T13:15:50.263 回答
1

这实际上与我提供的关于使用 numpy 读取/写入 csv 文件的另一个答案非常相关:

Python:如何像在 R 中一样进行基本的数据操作?

无论如何,您绝对应该使用 numpy!索引等的易用性远远超过了额外依赖的成本(嗯,我认为是这样)。当然,PyTables 也依赖于 numpy。

否则,这实际上取决于您的应用程序、硬件和受众。我怀疑与 PyTables 相比,读取您正在谈论的大小的 csv 文件在速度方面并不重要。但如果这是一个问题,写一个基准!读取和写入一些随机数据 100 次。或者,如果读取时间更重要,则写入一次,读取 100 次,等等。

我强烈怀疑 PyTables 会胜过 SQL。SQL 将在复杂的多表查询(特别是如果您经常执行相同的查询)上摇摆不定,但即使在单表(所谓的“非规范化”)表查询上,pytables 在速度方面也很难被击败。我找不到这个副手的参考资料,但如果你在这里挖掘链接,你也许可以挖掘一些东西:

http://www.pytables.org/moin/HowToUse#HintsforSQLusers

我猜你在这个阶段的执行性能与编码器性能相比会相形见绌。所以,最重要的是,选择对你最有意义的东西!

其他要点:

与 SQL 一样,PyTables 具有撤消功能。CSV 文件没有这个,但您可以将它们保存在版本控制中,并且您的 VCS 不需要太聪明(CSV 文件是文本)。

在相关说明中,CSV 文件将比二进制格式大得多(您当然也可以为此编写自己的测试)。

于 2011-06-23T01:08:29.623 回答
0

这些不是“排他性”的选择。

你需要两者。

CSV 只是一种数据交换格式。如果使用 pytables,仍然需要以 CSV 格式导入导出。

于 2010-10-26T11:07:43.727 回答