问题标签 [hdf5]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
matlab - 如何在 MATLAB 中将行向量保存到 HDF?
出于某种原因,hdf5write
当我重新读取行向量时,MATLAB 中的方法会自动将它们转换为列向量:
但是,对于第三维的行向量,它会很好地返回:
我怎样才能hdf5write
为行向量做正确的事情?它们应该以 1 x 10 而不是 10 x 1 的形式返回。
编辑问题稍微复杂一些,因为我使用基于 c 的 mex 稍后实际读取数据,而不是hdf5read
. 此外,问题确实出在 中hdf5write
,这在 hdf5 文件本身中可见:
即数据以一维数组的形式保存在 hdf5 文件中。为了比较,我用一个实际的二维矩阵(以显示它的样子)、一个一维列向量、一个沿第三维的一维向量尝试同样的事情,并且,为了踢球,试试这个V71Dimensions
技巧对hdf5read
和都有帮助hdf5write
:
所以,问题似乎出在hdf5write
. 该'V71Dimensions'
标志没有帮助:生成的 hdf5 文件仍然是数据集 {10} 而不是数据集 {10,1}。
python - 有使用 h5py 在 Python 中对大数据进行分析工作的经验吗?
我做了很多统计工作,并使用 Python 作为我的主要语言。虽然我使用的一些数据集可能占用 20GB 的内存,这使得使用 numpy、scipy 和 PyIMSL 中的内存函数对它们进行操作几乎是不可能的。统计分析语言 SAS 在这里有一个很大的优势,它可以对来自硬盘的数据进行操作,而不是严格的内存处理。但是,我想避免在 SAS 中编写大量代码(出于各种原因),因此我试图确定我对 Python 有哪些选择(除了购买更多的硬件和内存)。
我应该澄清,像 map-reduce 这样的方法对我的大部分工作没有帮助,因为我需要对完整的数据集进行操作(例如计算分位数或拟合逻辑回归模型)。
最近我开始使用h5py并认为它是我发现的最好的选择,它允许 Python 像 SAS 一样运行并操作来自磁盘的数据(通过 hdf5 文件),同时仍然能够利用 numpy/scipy/matplotlib 等。我想知道是否有人有在类似环境中使用 Python 和 h5py 的经验以及他们发现了什么。有没有人能够在迄今为止由 SAS 主导的“大数据”设置中使用 Python?
编辑:购买更多硬件/内存肯定会有所帮助,但从 IT 的角度来看,当 Python(或 R 或 MATLAB 等)需要将数据保存在内存中时,我很难将 Python 卖给需要分析大量数据集的组织. SAS 在这方面继续拥有强大的卖点,因为虽然基于磁盘的分析可能较慢,但您可以自信地处理庞大的数据集。因此,我希望 Stackoverflow-ers 可以帮助我弄清楚如何降低使用 Python 作为主要大数据分析语言的感知风险。
r - 在 hdf5save 中保存会创建一个不可读的文件
我正在尝试使用 R 将数组保存为 HDF5 文件,但没有运气。
尝试诊断我运行的问题example(hdf5save)
。这成功创建了一个 HDF5 文件,我可以使用h5dump
.
然后当我手动运行 R 代码时,我发现它不起作用。我运行的代码与示例脚本中运行的代码完全相同(除了更改文件名以避免覆盖)。这是代码:
这是来自的错误消息h5dump
:
有没有人有任何想法?我完全不知所措。
谢谢
file - MATLAB:使用“-append”标志时,将多个变量保存到“-v7.3”(HDF5).mat 文件似乎更快。怎么会?
注意: 此问题涉及 2011 年观察到的旧 MATLAB 版本 (R2009a) 的问题。根据以下 2016 年 7 月的更新,MATLAB 中的问题/错误似乎不再存在(使用 R2016a 测试;向下滚动到问题末尾以查看更新)。
我正在使用 MATLAB R2009b,我需要编写一个更大的脚本,将一组更大的 .zip 文件的内容转换为 v7.3 mat 文件(具有底层 HDF5 数据模型)。读书没问题。问题在于储蓄。而且实际上没有问题。我的文件使用save命令保存得很好。
我的问题更有意义:为什么我在 MATLAB 中观察到以下令人惊讶的(对我而言)行为?
让我们看一下我的一般问题。在当前的测试场景中,我将生成一个输出:A -v7.3 mat-file。这个 .mat 文件将包含 40个块作为单独的变量。每个变量将被命名为从 1 到 40 的“block_NNN”,并将包含一个带有字段frames和blockNo的结构。字段帧包含 480x240x65 的 uint8 图像数据序列(这里只是使用randi生成的随机数据)。字段blockNo包含块号。
备注:在真正的脚本中(我还没有完成)我将总共执行 370 次以上操作,转换总共 108GB 的原始数据。这就是为什么我关心以下内容。
无论如何,首先我定义一些通用变量:
然后我生成一些形状和大小与实际原始数据相同的虚拟代码:
我现在将所有随机测试数据都放在 struct stu_data2disk中。现在我想使用两种可能的方法之一来保存数据。
让我们先尝试一个简单的:
该文件写入没有问题(286MB)。输出是:
好的 - 然后我记得我想在 40 个块上遵循保存程序。因此,我不是上面的,而是遍历块并按顺序附加它们:
该文件再次保存得很好(286MB)。输出是:
有趣的是,附加方法要快得多?我的问题是为什么?
输出dir converted*.mat
:
这些文件的大小不相同。在 Windows 7 中使用fc进行的测试显示......很多二进制差异。也许数据被转移了一点——因此这并没有告诉我们什么。
有人知道这里发生了什么吗?附加文件是否使用了更优化的数据结构?或者,也许 Windows 已经缓存了文件并使其访问速度更快?
我也努力从这两个文件中进行测试读取。如果不在这里显示数字,附加版本会更快一些(但从长远来看可能意味着什么)。
[编辑]:我只是尝试使用无格式标志(在我的系统上默认为 -v7)并且没有太大区别了:
[编辑]:我纠正了上述错误。之前我提到统计数据是针对 -v6 的,但我错了。我刚刚删除了格式标志并假设默认值为 -v6 但实际上它是 -v7。
我使用 Andrew 的精细框架为我的系统上的所有格式创建了新的测试统计信息(所有格式都用于相同的随机测试数据,现在从文件中读取):
以及文件的大小:
因此 -v6 似乎是最快的编写方式。文件大小也没有太大差异。据我所知,HDF5 确实内置了一些基本的膨胀方法。
嗯,可能是对底层 HDF5 写入函数的一些优化?
目前我仍然认为一些底层的基本 HDF5 写入函数已针对将数据集添加到 HDF5 文件进行了优化(这是在将新变量添加到 -7.3 文件时发生的情况)。我相信我已经在某处读到 HDF5 应该以这种方式优化......虽然不能确定。
其他需要注意的细节:
正如我们在下面安德鲁的回答中看到的那样,这种行为非常系统化。至于您是在函数的本地范围内还是在 m 脚本的“全局”范围内运行这些东西,这似乎也很重要。我的第一个结果来自将文件写入当前目录的 m 脚本。我仍然只能在 m 脚本中重现 -7.3 的 1 秒写入。函数调用显然增加了一些开销。
2016 年 7 月更新:
我再次找到了这个,并认为我可以使用目前可用的最新 MATLAB 对其进行测试。在 Windows 7 x64 上使用 MATLAB R2016a,问题似乎已得到解决:
这在下面接受的答案中使用 Andrew Janke 的reproMatfileAppendSpeedup
函数进行了测试(5 次通过,格式为 7.3)。现在,-append
对于单次保存来说同样慢,或者更慢 - 应该是这样。可能是 R2009a 中使用的 HDF5 驱动程序的早期版本存在问题。
matlab - MATLAB:.mat 版本之间的差异
官方文档声明如下:
. 但我注意到,除了上表中所述之外,还有其他重要的区别。
例如,在 MATLAB 中保存一个包含大约 6,000 个元素且占用176 MB内存的元胞数组会根据我使用-v7还是-v7.3给出以下结果:
- 使用-v7:文件大小 = 15 MB,保存和加载速度很快。
- 使用-v7.3:文件大小 = 400 MB,并且保存和加载非常 慢(可能部分是因为文件很大)。
有没有其他人注意到这些差异?
更新 1:正如回复所指出的,-v7.3依赖于 HDF5,并且根据 Mathworks,“这种格式有很大的存储开销”,尽管目前尚不清楚这种开销是否真的是由于格式本身,还是由于 MATLAB HDF5 的实施和处理。
更新 2:@Andrew Janke 向我们指出了这个非常有用的 PDF(显然在网络上没有 HTML 格式)。有关更多详细信息,请参阅@Amro 提供的答案中的评论。
这一切都把我带到了下一个问题:是否有任何替代方案结合了两全其美(例如 -v7 的效率和-v7.3处理非常大文件的能力)?
python - 无法为 Python 2.7 重新安装 PyTables
除了 2.7 之外,我还安装了 Python 2.7。再次为 2.7 安装 PyTables 时,出现此错误 -
- 发现安装了 numpy 1.5.1 包。.. 错误:: 找不到本地 HDF5 安装。您可能需要通过设置
HDF5_DIR
环境变量或使用--hdf5
命令行选项明确说明可以在何处找到本地 HDF5 头文件和库。
我不清楚 HDF 的安装。我再次下载 - 并将其复制到 /usr/local/hdf5 目录中。并尝试按照 PyTable 安装中的建议设置环境变量。有没有其他人有这个问题可以提供帮助?
python - PyTables 批量获取和更新
我将每日库存数据作为使用 PyTables 创建的 HDF5 文件。我想获取一组行,将其作为数组处理,然后使用 PyTables 将其写回磁盘(更新行)。我想不出一个干净的方法来做到这一点。您能否让我知道实现这一目标的最佳方法是什么?
我的数据:
我想将与每个符号对应的行作为数组读取,进行一些处理并更新字段 var1 和 var2。我事先知道所有的符号,所以我可以遍历它们。我试过这样的事情:
我想将 rows_array 传递给另一个函数,该函数将计算 var1 和 var2 的值并为每条记录更新它。请注意,var1、var2 就像移动平均线,所以我无法在迭代器内计算它们,因此需要将整个行集作为一个数组。
在我使用 rows_array 计算出我需要的任何内容后,我不确定如何将其写回数据,即使用新的计算值更新行。更新整个表时,我使用这个:
但是,当我只想更新表的一部分时,我不是最好的方法。我想我可以重新运行“where”条件,然后根据我的计算更新每一行,但这似乎是在浪费时间重新扫描表格。
感谢您的建议...
谢谢,-e
macos - OS X 运行时链接器发现错误的 lib 版本
我有一个从我的 Python 程序调用的 C++ 共享库。C++ 库是用我在 OS X 上使用 homebrew 安装的 HDF5 编译的,所以它位于/usr/local/lib
. 现在的问题是我还安装了 PyTables,其中包括旧版本的 libhdf5,安装在/Library/Frameworks/EPD64.framework/Versions/Current/...
我可以很好地编译和链接我的库,并且otool -L
确实指向/usr/local/lib/libhdf5.dylib
. 但是,当我尝试从 Python 运行它时,会出现版本不匹配错误。不知何故,运行时链接器正在加载旧的 hdf5 库。
一种解决方法是将 hdf5 构建为静态库,但我想找到一个更简洁的解决方案 - 我如何说服运行时链接器使用更新的库?我已经尝试设置 DYLD_LIBRARY_PATH 但这只是破坏了其他一切(Python 和 MacVim 无法启动)。
python - 如何使用正则表达式删除 python 字符串中的十六进制值?
我在matlab中有一个单元格数组
我使用这些脚本,它们利用 matlab 的 hdf5write 函数将数组保存为 hdf5 格式。
然后我使用 pytables 将 hdf5 文件读入 python。元胞数组以 numpy 字符串数组的形式出现。我转换为列表,这是输出:
这些十六进制值从某个地方弹出到字符串中,我想删除它们。它们并不总是出现在列表的前三个项目中,我需要一种很好的方法来处理它们或找出它们为什么会出现在首位。
我尝试使用正则表达式来删除十六进制值,但运气不佳。
关于如何处理这个问题的任何建议?
c++ - 如何在 C++ 中拆分 HDF5 复合数据类型
我有一个复合类型(int、double、double)的 HDF5 文件。目前,我按照文档中的示例,通过将其结果存储在结构数组中,在单个操作中读取它。
但是,我宁愿将这三个部分中的每一个都保存在不同的数组中,所以我想提供 3 个指针 (int*, double*, double*) 并直接在 3 个数组中读取数据而不复制数据。
有人对如何做到这一点有建议吗?