我最近遇到了Pytables并发现它非常酷。很明显,对于非常大的数据集,它们优于csv格式。我正在使用python运行一些模拟。输出不是很大,比如200列和2000行。
如果有人对两者都有经验,那么从长远来看,你能否建议哪种格式对于不是很大的数据集会更方便。 Pytables具有数据处理功能和使用Vitables浏览数据,但浏览器没有像Excel那样可用于CSV的功能。同样,如果主要在python中工作,你是否找到一个比另一个更好的导入和导出数据?在文件组织方面更方便吗?对这些问题的任何评论都会有所帮助。
感谢。
答案 0 :(得分:6)
您是否考虑过Numpy阵列?
当您的数据太大而无法容纳在内存中时,PyTables非常棒,但是a 200字节的8字节浮点矩阵只需要大约3MB的内存。所以我认为 PyTables可能有点过分。您可以使用np.savetxt
或np.savez
(用于压缩)将numpy数组保存到文件中,并可以使用np.loadtxt
或np.load
从文件中读取它们。
如果你有许多这样的数组存储在磁盘上,那么我建议使用数据库而不是numpy .npz
文件。顺便说一句,要在数据库中存储200x2000矩阵,您只需要3个表列:row,col,value:
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矩阵,你只需要一个表列来指定哪个矩阵。
答案 1 :(得分:2)
就导入/导出而言,PyTables使用名为HDF5的标准化文件格式。许多科学软件包(如MATLAB)都内置了对HDF5的支持,而C API并不可怕。因此,您需要从其中一种语言导出或导入其中的任何数据都可以保存在HDF5文件中。
PyTables确实添加了自己的一些属性,但这些属性不会对你造成伤害。当然,如果将Python对象存储在文件中,您将无法在其他地方读取它们。
CSV文件的一个好处是它们是人类可读的。但是,如果您需要在其中存储除简单数字以外的任何内容并与他人交流,那么您将遇到问题。我从其他组织的人那里收到CSV文件,我注意到人类并不擅长确保字符串引用等内容正确完成。 Python的CSV解析器和它一样灵活,这很好。另一个问题是浮点数不能使用十进制格式精确地存储在文本中。但这通常足够好。
答案 2 :(得分:2)
PyTables的一大优点是元数据的存储,如变量等。 如果您使用不同的参数更频繁地运行模拟,则将结果存储为h5文件中的数组条目。
我们使用它来存储测量数据+实验脚本以获取数据,因此它是全部自包含的。
BTW:如果您需要快速查看hdf5文件,可以使用HDFView。这是一个免费的HDFGroup Java应用程序。它很容易安装。
答案 3 :(得分:1)
我认为很难比较pytables和csv .. pyTables是一种数据结构,而CSV是数据的交换格式。
答案 4 :(得分:1)
这实际上与我提供的关于读取/编写带有numpy的csv文件的另一个答案非常相关:
Python: how to do basic data manipulation like in 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文件将比二进制格式大得多(你当然可以为此编写自己的测试)。
答案 5 :(得分:0)
这些不是“独家”选择。
你需要两者。
CSV只是一种数据交换格式。如果使用pytables,则仍需要以CSV格式导入和导出。