我需要以某种方式在磁盘上存储512 ^ 3阵列,我目前正在使用HDF5.由于阵列稀疏,因此浪费了大量磁盘空间.
HDF5是否为稀疏阵列提供任何支持?
我需要帮助才能做出决定.我需要在我的应用程序中传输一些数据,并且必须在这三种技术之间做出选择.我已经阅读了所有技术(教程,文档),但仍然无法决定......
他们如何比较?
我需要支持元数据(接收文件的能力和没有任何附加信息/文件的读取),快速读/写操作,存储动态数据的能力将是一个加号(如Python对象)
我已经知道的事情:
PS:我需要传输的数据是NumPy/SciPy的"工作结果"(数组,复杂结构的数组等)
UPD:需要跨语言访问(C/C++/Python)
我在HDF5 1.8.7中使用HDF5 C++ API,并希望使用H5 :: Attribute实例在H5 :: DataSet实例中设置几个标量属性,但找不到任何示例.使用C API非常干净和干燥:
/* Value of the scalar attribute */
int point = 1;
/*
* Create scalar attribute for the dataset, my_dataset.
*/
aid2 = H5Screate(H5S_SCALAR);
attr2 = H5Acreate(my_dataset, "Integer attribute", H5T_NATIVE_INT, aid2,H5P_DEFAULT);
/*
* Write scalar attribute to my_dataset.
*/
ret = H5Awrite(attr2, H5T_NATIVE_INT, &point);
/*
* Close attribute dataspace.
*/
ret = H5Sclose(aid2);
/*
* Close attribute.
*/
ret = H5Aclose(attr2);
Run Code Online (Sandbox Code Playgroud)
由于某些奇怪的原因,C++ API中的H5 :: Attribute和H5 :: DataSet类似乎缺少必要的方法.如果有人能够使用C++ API提出一个具体的例子,我将非常感激.
我有一个由PyTables生成的相当大的HDF5文件,我试图在集群上读取.当我读到一个单独的块时,我遇到了NumPy的问题.我们来看看这个例子:
HDF5文件中阵列的总形状是,
In [13]: data.shape
Out[13]: (21933063, 800, 3)
Run Code Online (Sandbox Code Playgroud)
此数组中的每个条目都是a np.float64.
我让每个节点读取大小的切片(21933063,10,3).不幸的是,NumPy似乎无法一次读取所有2100万个子对象.我试图通过将这些切片分成10个大小的切片(2193306,10,3)然后使用以下简化来使事情正常工作:
In [8]: a = reduce(lambda x,y : np.append(x,y,axis=0), [np.array(data[i* \
chunksize: (i+1)*chunksize,:10],dtype=np.float64) for i in xrange(k)])
In [9]:
Run Code Online (Sandbox Code Playgroud)
在哪里1 <= k <= 10和chunksize = 2193306.此代码适用于k <= 9; 否则我得到以下内容:
In [8]: a = reduce(lambda x,y : np.append(x,y,axis=0), [np.array(data[i* \
chunksize: (i+1)*chunksize,:10],dtype=np.float64) for i in xrange(k)])
Floating point exception
home@mybox 00:00:00 ~
$
Run Code Online (Sandbox Code Playgroud)
我尝试使用Valgrind的memcheck工具来弄清楚发生了什么,似乎PyTables就是罪魁祸首.跟踪中显示的两个主要文件是libhdf5.so.6与之相关的文件blosc …
HDF5创建的文件和文件之间是否有区别PyTables?
PyTables有两个功能,.isHDFfile()并.isPyTablesFile()建议两种格式之间存在差异.
我已经在谷歌上做了一些调查,并且已经认识到PyTables是建立在HDF之上的,但我无法找到更多.
我对互操作性,速度和开销特别感兴趣.
谢谢.
我最近在ubuntu机器上安装了hdf5库,现在无法链接到导出的函数.我写了一个简单的测试脚本readHDF.cpp来解释这个问题:
#include <hdf5.h>
int main(int argc, char * argv[])
{
hid_t h5_file_id = H5Fopen(argv[1], H5F_ACC_RDWR, H5P_DEFAULT);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译命令是
g++ -Wl,-rpath,$HOME/hdf5/lib -I$HOME/hdf5/include \
-L$HOME/hdf5/lib -l:$HOME/hdf5/lib/libhdf5.so readHDF.cpp
Run Code Online (Sandbox Code Playgroud)
返回以下错误
/tmp/cc6DXdxV.o: In function `main':
readHDF.cpp:(.text+0x1f): undefined reference to `H5check_version'
readHDF.cpp:(.text+0x3c): undefined reference to `H5Fopen'
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
我很困惑,因为nm命令似乎说该函数已被导出:
nm -C $HOME/hdf5/lib/libhdf5.so | grep H5check_version
Run Code Online (Sandbox Code Playgroud)
返回
0000000000034349 T H5check_version
Run Code Online (Sandbox Code Playgroud)
和类似的结果H5Fopen.什么可能出错?不确定它是否有帮助,但如果我注释掉H5Fopen脚本的部分,那么它编译得很好:
#include <hdf5.h>
int main(int argc, char * argv[])
{
hid_t …Run Code Online (Sandbox Code Playgroud) 我有一个大的hdf5文件,看起来像这样:
A/B/dataset1, dataset2
A/C/dataset1, dataset2
A/D/dataset1, dataset2
A/E/dataset1, dataset2
Run Code Online (Sandbox Code Playgroud)
...
我想创建一个仅包含以下内容的新文件:A/B/dataset1,dataset2 A/C/dataset1,dataset2
python中最简单的方法是什么?
我做了:
fs = h5py.File('source.h5', 'r')
fd = h5py.File('dest.h5', 'w')
fs.copy('group B', fd)
Run Code Online (Sandbox Code Playgroud)
问题是我得到了dest.h5:
B/dataset1, dataset2
Run Code Online (Sandbox Code Playgroud)
并且我遗漏了一部分树枝.
我在Ubuntu 12.04(32位版本)下使用Anaconda作为Python发行版并在ipython笔记本中编写,显然创建了一个没有任何问题的HDF5文件.底层数据都是numpy数组.例如,
import numpy as np
import h5py
f = h5py.File('myfile.hdf5','w')
group = f.create_group('a_group')
group.create_dataset(name='matrix', data=np.zeros((10, 10)), chunks=True, compression='gzip')
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试从新的iypthon笔记本打开此文件,我会收到一条错误消息:
f = h5py.File('myfile.hdf5', "r")
---------------------------------------------------------------------------
IOError Traceback (most recent call last)
<ipython-input-4-b64ac5089cd4> in <module>()
----> 1 f = h5py.File(file_name, "r")
/home/sarah/anaconda/lib/python2.7/site-packages/h5py/_hl/files.pyc in __init__(self, name, mode, driver, libver, userblock_size, **kwds)
220
221 fapl = make_fapl(driver, libver, **kwds)
--> 222 fid = make_fid(name, mode, userblock_size, fapl)
223
224 Group.__init__(self, fid)
/home/sarah/anaconda/lib/python2.7/site-packages/h5py/_hl/files.pyc in make_fid(name, mode, userblock_size, fapl, fcpl)
77
78 if mode == …Run Code Online (Sandbox Code Playgroud) 我认为标题涵盖了这个问题,但要阐明:
的熊猫 Python包具有用于在python保持表数据的数据帧的数据类型.它还有一个方便的hdf5文件格式接口,所以pandas DataFrames(和其他数据)可以使用简单的类似dict的界面保存(假设你安装了pytables)
import pandas
import numpy
d = pandas.HDFStore('data.h5')
d['testdata'] = pandas.DataFrame({'N': numpy.random.randn(5)})
d.close()
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.但是,如果我然后尝试将相同的hdf5加载到RI中,请看事情并非如此简单:
> library(hdf5)
> hdf5load('data.h5')
NULL
> testdata
$block0_values
[,1] [,2] [,3] [,4] [,5]
[1,] 1.498147 0.8843877 -1.081656 0.08717049 -1.302641
attr(,"CLASS")
[1] "ARRAY"
attr(,"VERSION")
[1] "2.3"
attr(,"TITLE")
[1] ""
attr(,"FLAVOR")
[1] "numpy"
$block0_items
[1] "N"
attr(,"CLASS")
[1] "ARRAY"
attr(,"VERSION")
[1] "2.3"
attr(,"TITLE")
[1] ""
attr(,"FLAVOR")
[1] "numpy"
attr(,"kind")
[1] "string"
attr(,"name")
[1] "N."
$axis1
[1] 0 1 2 3 …Run Code Online (Sandbox Code Playgroud)