我正在尝试编写一个使用libhdf5的matlab mex函数; 我的Linux安装提供了libhdf5-1.8共享库和头文件.但是,我的Matlab版本r2007b提供了1.6版本的libhdf5.so.(matlab .mat文件bootstrap hdf5,显然).当我编译mex时,它在Matlab中会出现段错误.如果我将我的libhdf5版本降级到1.6(不是长期选项),代码编译并运行正常.
问题:我该如何解决这个问题?如何告诉mex编译过程链接/usr/lib64/libhdf5.so.6而不是/opt/matlab/bin/glnxa64/libhdf5.so.0?当我尝试-Wl,-rpath-link,/usr/lib64在我的编译中使用时,我得到的错误如下:
/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/../../../../x86_64-pc-linux-gnu/bin/ld: warning: libhdf5.so.0, needed by /opt/matlab/matlab75/bin/glnxa64/libmat.so, may conflict with libhdf5.so.6
/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/../../../../lib64/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
collect2: ld returned 1 exit status
mex: link of 'hdf5_read_strings.mexa64' failed.
make: *** [hdf5_read_strings.mexa64] Error 1
Run Code Online (Sandbox Code Playgroud)
ACK.最后一种方法是下载hdf5-1.6.5标题的本地副本并完成它,但这不是未来的证明(Matlab版本升级是我的未来.).有任何想法吗?
编辑:根据Ramashalanka的优秀建议,我
A)要求mex -v获得3个gcc命令; 最后一个是链接器命令;
B)用a -v来调用该链接器命令来获取collect命令;
C)调用它collect2 -v -t和其余的标志.
我输出的相关部分:
/usr/bin/ld: mode elf_x86_64
/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/../../../../lib64/crti.o
/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/crtbeginS.o
hdf5_read_strings.o
mexversion.o
-lmx (/opt/matlab/matlab75/bin/glnxa64/libmx.so)
-lmex (/opt/matlab/matlab75/bin/glnxa64/libmex.so)
-lhdf5 (/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/../../../../lib64/libhdf5.so)
/lib64/libz.so
-lm (/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/../../../../lib64/libm.so) …Run Code Online (Sandbox Code Playgroud) 我正在研究一个涉及RHEL 6.3(x86_64)系统上的网络消息队列(msgpack,zmq,...)的项目.我正在安装最新的glib,gevent,pygobject,pygtk等软件包,以便让pylab/matplotlib工作(这也没有成功).
放弃后我回到我的代码,不知怎的,我设法破坏了我的hdf5/h5py安装 - h5py在导入时无法找到libhdf5.so.7.我立即在RHEL 6.3(x86_64)上的/ usr/local/hdf5中重新安装了hdf5-1.8.9,如下所示:
./configure --prefix=/usr/local/hdf5
make
make check
sudo make install
make check install
Run Code Online (Sandbox Code Playgroud)
这似乎工作得很好.然后我去重新安装h5py(在python 2.7.3中):
python2.7 setup.py build --hdf5=/usr/local/hdf5/
python2.7 setup.py test # optional
# sudo python2.7 setup.py install
Run Code Online (Sandbox Code Playgroud)
无法在测试中导入_errors文件,如下所示:
======================================================================
ERROR: _hl.tests.test_attrs_data (unittest.loader.ModuleImportFailure)
----------------------------------------------------------------------
ImportError: Failed to import test module: _hl.tests.test_attrs_data
Traceback (most recent call last):
File "/usr/local/lib/python2.7/unittest/loader.py", line 252, in _find_tests
module = self._get_module_from_name(name)
File "/usr/local/lib/python2.7/unittest/loader.py", line 230, in _get_module_from_name
__import__(name)
File "/home/cronburg/Downloads/h5py-2.0.1/build/lib.linux-x86_64-2.7/h5py/_hl/tests/test_attrs_data.py", line 5, in <module>
import h5py
File "/home/cronburg/Downloads/h5py-2.0.1/build/lib.linux-x86_64-2.7/h5py/__init__.py", line 1, …Run Code Online (Sandbox Code Playgroud) 我试图理解PyTables如何管理大小大于内存大小的数据.这是PyTables代码中的注释(链接到GitHub):
# Nodes referenced by a variable are kept in `_aliveNodes`.
# When they are no longer referenced, they move themselves
# to `_deadNodes`, where they are kept until they are referenced again
# or they are preempted from it by other unreferenced nodes.
Run Code Online (Sandbox Code Playgroud)
在_getNode方法中也可以找到有用的注释.
似乎PyTables有非常智能的IO缓冲系统,据我所知,它将用户在快速RAM中引用的数据存储为"aliveNodes",在之前保持引用,当前未引用的数据为"deadNodes",以便在需要时快速"恢复"它,以及如果请求的密钥在死或活类别中都不存在,则从磁盘读取数据.
我需要一些关于PyTables在处理大于可用内存的数据时如何处理情况的专业知识.我的具体问题:
params['NODE_CACHE_SLOTS'].它可以以某种方式由用户指定吗?例如,如果我想为其他需要内存的应用程序留下一些RAM?.flush()在每个基本.append()周期后使用.这个周期实际上可以有多长?我正在执行一些基准测试,比较SQLite和PyTables如何处理从大型CSV文件创建一个包含键值对的巨大表格.当我使用时.flush(),主循环中的频率较低,PyTables获得了巨大的加速.那么 - 对于.append()相对较大的数据块是否正确,然后使用.flush()?我有一个通过HDFStore存储的Pandas DataFrame,它基本上存储了关于我正在进行的测试运行的摘要行.
每行中的几个字段包含可变长度的描述性字符串.
当我进行测试运行时,我创建了一个新的DataFrame,其中包含一行:
def export_as_df(self):
return pd.DataFrame(data=[self._to_dict()], index=[datetime.datetime.now()])
Run Code Online (Sandbox Code Playgroud)
然后调用HDFStore.append(string, DataFrame)将新行添加到现有DataFrame.
这很好,除了其中一个字符串列内容大于已存在的最长实例,我得到以下错误:
File "<ipython-input-302-a33c7955df4a>", line 516, in save_pytables
store.append('tests', test.export_as_df())
File "/Library/Frameworks/EPD64.framework/Versions/7.3/lib/python2.7/site-packages/pandas/io/pytables.py", line 532, in append
self._write_to_group(key, value, table=True, append=True, **kwargs)
File "/Library/Frameworks/EPD64.framework/Versions/7.3/lib/python2.7/site-packages/pandas/io/pytables.py", line 788, in _write_to_group
s.write(obj = value, append=append, complib=complib, **kwargs)
File "/Library/Frameworks/EPD64.framework/Versions/7.3/lib/python2.7/site-packages/pandas/io/pytables.py", line 2491, in write
min_itemsize=min_itemsize, **kwargs)
File "/Library/Frameworks/EPD64.framework/Versions/7.3/lib/python2.7/site-packages/pandas/io/pytables.py", line 2254, in create_axes
raise Exception("cannot find the correct atom type -> [dtype->%s,items->%s] %s" % (b.dtype.name, b.items, str(detail)))
Exception: cannot find the correct atom type …Run Code Online (Sandbox Code Playgroud) 我正在使用CSV格式的大型数据集.我试图逐列处理数据,然后将数据附加到HDF文件中的帧.所有这些都是使用Pandas完成的.我的动机是,虽然整个数据集比我的物理内存大得多,但列大小是可管理的.在稍后阶段,我将通过逐列将列加载回内存并对其进行操作来执行特征逐步逻辑回归.
我能够创建一个新的HDF文件并使用第一列创建一个新框架:
hdf_file = pandas.HDFStore('train_data.hdf')
feature_column = pandas.read_csv('data.csv', usecols=[0])
hdf_file.append('features', feature_column)
Run Code Online (Sandbox Code Playgroud)
但在那之后,我在尝试向框架追加新列时遇到了ValueError:
feature_column = pandas.read_csv('data.csv', usecols=[1])
hdf_file.append('features', feature_column)
Run Code Online (Sandbox Code Playgroud)
堆栈跟踪和错误消息:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python2.7/dist-packages/pandas/io/pytables.py", line 658, in append self._write_to_group(key, value, table=True, append=True, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/pandas/io/pytables.py", line 923, in _write_to_group s.write(obj = value, append=append, complib=complib, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/pandas/io/pytables.py", line 2985, in write **kwargs)
File "/usr/local/lib/python2.7/dist-packages/pandas/io/pytables.py", line 2675, in create_axes raise ValueError("cannot match existing table structure for [%s] on appending data" % items)
ValueError: …Run Code Online (Sandbox Code Playgroud) 我有多个大型(> 10GB)SAS数据集,我想转换它们用于pandas,最好是HDF5.有许多不同的数据类型(日期,数字,文本),一些数字字段也有不同的错误代码用于缺失值(即值可以是.,.E,.C等)我希望保留列名和标签元数据.有没有人找到一种有效的方法来做到这一点?
我尝试使用MySQL作为两者之间的桥梁,但我在传输时遇到了一些超出范围的错误,而且速度非常慢.我也试过以Stata .dta格式从SAS导出,但SAS(9.3)以旧的Stata格式导出,与pandas中的read_stat()不兼容.我也尝试了sas7bdat包,但是从描述中它还没有被广泛测试,所以我想以另一种方式加载数据集并比较结果以确保一切正常.
额外的细节:我想要转换的数据集是来自WRDS的CRSP,Compustat,IBES和TFN的数据集.
如何使用h5pyPython库调整HDF5阵列的大小?
我已经尝试使用该.resize方法并在chunks设置为的数组上True.唉,我还在遗漏一些东西.
In [1]: import h5py
In [2]: f = h5py.File('foo.hdf5', 'w')
In [3]: d = f.create_dataset('data', (3, 3), dtype='i8', chunks=True)
In [4]: d.resize((6, 3))
/home/mrocklin/Software/anaconda/lib/python2.7/site-packages/h5py/_hl/dataset.pyc in resize(self, size, axis)
--> 277 self.id.set_extent(size)
ValueError: unable to set extend dataset (Dataset: Unable to initialize object)
In [11]: h5py.__version__
Out[11]: '2.2.1'
Run Code Online (Sandbox Code Playgroud) 我有大约500个HDF5文件,每个大约1.5 GB.
每个文件都具有相同的精确结构,即7个复合(int,double,double)数据集和可变数量的样本.
现在我想通过连接每个数据集来连接所有这些文件,以便最后我有一个包含7个数据集的750 GB文件.
目前我正在运行一个h5py脚本:
这显然需要几个小时,你有关于改善这个的建议吗?
我正在开发一个集群,所以我可以并行使用HDF5,但是我在C编程中不够自己实现一些东西,我需要一个已经编写过的工具.
我一直试图找到解决HDF5 C++绑定的一些缺点的方法.目前,我的代码中充斥着类似于以下内容的try/catch块:
H5::Exception::dontPrint();
H5::H5File *file = NULL;
try {
file = new H5::H5File(fname.c_str(), H5F_ACC_RDWR);
} catch(H5::FileIException &file_exists_err) {
file = new H5::H5File(fname.c_str(), H5F_ACC_TRUNC);
}
Run Code Online (Sandbox Code Playgroud)
这不是必需的 - 我想要做的就是打开一个文件进行读/写访问,如果不存在,则创建它.另一个棘手的问题是创建一个嵌套组(例如"/ parent/group"),其中父组不一定存在.在Unix/Linux中,等效的是
mkdir -p parent/group
Run Code Online (Sandbox Code Playgroud)
但是,在HDF5 C++绑定中,创建其父组不存在的组会引发异常.
出于这些原因,我有动力创建一个头文件来处理这些常见问题.我的第一个想法是简单地创建一组函数,例如,采用文件名和访问模式并返回H5 :: H5File对象,或者获取组名并返回组对象.我认为这不太理想,因为它使得使用此头文件的程序员在返回的对象上调用"delete",即使程序员从未在自己的代码中明确地调用"new".这似乎是要求内存泄漏.
因此,我的第二个想法是从H5 :: H5File和H5 :: H5Group创建一组派生类,其中构造函数在文件尚不存在时不会抛出异常,或者当组的父组尚不存在时.我对派生文件类的尝试如下:
namespace H5Utils {
class H5File : public H5::H5File {
public:
H5File(std::string fname);
~H5File();
};
}
H5Utils::H5File::H5File(std::string fname)
try : H5::H5File(fname.c_str(), H5F_ACC_RDWR)
{
std::cerr << "Opened existing file." << std::endl;
} catch(H5::FileIException &file_exists_err) {
std::cerr << "File does not exist. …Run Code Online (Sandbox Code Playgroud) 这似乎是一个简单的问题,但我无法理解它.
我有一个在双循环中运行的模拟,并将结果写入HDF文件.该程序的简单版本如下所示:
import tables as pt
a = range(10)
b = range(5)
def Simulation():
hdf = pt.openFile('simulation.h5',mode='w')
for ii in a:
print(ii)
hdf.createGroup('/','A%s'%ii)
for i in b:
hdf.createArray('/A%s'%ii,'B%s'%i,[ii,i])
hdf.close()
return
Simulation()
Run Code Online (Sandbox Code Playgroud)
这段代码正是我想要的,但由于这个过程可能需要很长时间才能运行,我尝试使用多处理模块并使用以下代码:
import multiprocessing
import tables as pt
a = range(10)
b = range(5)
def Simulation(ii):
hdf = pt.openFile('simulation.h5',mode='w')
print(ii)
hdf.createGroup('/','A%s'%ii)
for i in b:
hdf.createArray('/A%s'%ii,'B%s'%i,[ii,i])
hdf.close()
return
if __name__ == '__main__':
jobs = []
for ii in a:
p = multiprocessing.Process(target=Simulation, args=(ii,))
jobs.append(p)
p.start()
Run Code Online (Sandbox Code Playgroud)
然而,这仅将最后一次模拟打印到HDF文件,不知何故它会覆盖所有其他组.