当前位置: 首页 > 面试题库 >

用h5py增量写入hdf5

应和悦
2023-03-14
问题内容

我有一个关于如何最好地使用python / h5py写入hdf5文件的问题。

我有类似的数据:

-----------------------------------------
| timepoint | voltage1 | voltage2 | ...
-----------------------------------------
| 178       | 10       | 12       | ...
-----------------------------------------
| 179       | 12       | 11       | ...
-----------------------------------------
| 185       | 9        | 12       | ...
-----------------------------------------
| 187       | 15       | 12       | ...
                    ...

具有约10 ^ 4列和约10 ^ 7行。(这大约是10 ^ 11(1000亿)个元素,或1个字节整数的〜100GB)。

有了这些数据,通常的用途是一次写入,多次读取,并且典型的读取情况将是获取列1和另一列(例如254),将这两个列都加载到内存中,并进行一些统计。

我认为一个好的hdf5结构将使上表中的每一列成为hdf5组,从而形成10 ^
4组。这样,我们就不需要将所有数据读入内存,是吗?hdf5结构尚未定义,因此可以是任何东西。

现在的问题是:我一次接收到大约10 ^ 4行的数据(并且每次接收的行数并不完全相同),并且需要将其递增地写入hdf5文件。我该如何写该文件?

我正在考虑使用python和h5py,但如果推荐的话,可以使用其他工具。正在分块走的路,例如

dset = f.create_dataset("voltage284", (100000,), maxshape=(None,), dtype='i8', chunks=(10000,))

然后,当另一个10 ^ 4行的块到达时,替换数据集?

还是仅将10 ^ 4行的每个块存储为单独的数据集更好?还是我真的需要知道最终的行数?(这将很难实现,但可能)。

如果它也不是正确的工具,我也可以保释hdf5,尽管我认为一旦完成笨拙的写入操作,它就会很棒。


问题答案:

根据FAQ,您可以使用扩展数据集dset.resize。例如,

import os
import h5py
import numpy as np
path = '/tmp/out.h5'
os.remove(path)
with h5py.File(path, "a") as f:
    dset = f.create_dataset('voltage284', (10**5,), maxshape=(None,),
                            dtype='i8', chunks=(10**4,))
    dset[:] = np.random.random(dset.shape)        
    print(dset.shape)
    # (100000,)

    for i in range(3):
        dset.resize(dset.shape[0]+10**4, axis=0)   
        dset[-10**4:] = np.random.random(10**4)
        print(dset.shape)
        # (110000,)
        # (120000,)
        # (130000,)


 类似资料:
  • 问题内容: 我正在使用Solr 4.2。请注意,完全导入有效,但增量导入却不起作用。增量导入不会产生任何错误,但不会获取任何更改。这是数据配置文件。 这是我没有运气的尝试。 将p.product_id =’$ {dih.delta.product_id}更改为p.product_id =’$ {dih.delta.id}以及其他方式。将updtime>’$ {dih.last_index_time

  • 问题内容: 错误: 违反主键约束。 无法在对象中插入重复的密钥。 如何使第一行之后的主键递增? 我希望能够同时向此表添加项目列表,而不是将其插入RBAR。 谢谢您的帮助 问题答案: 仅对于此语句,ID将是顺序的,例如,如果ID为99,并且要插入4条记录,则ID为100、101、102、103。如果同时插入多个进程,则很容易违反约束,但是这并不是说,这比使用单条记录本质上不安全的情况要糟。

  • 我试图在表中插入一行,带有一个自动递增字段,但我遇到了错误。该表的结构为: id:自动增量 级别:文本 概念:文本 . 在w3c中,我了解到要将新记录插入表中,我们不必为“自动增量”列指定值(将自动添加唯一值)。 我做错了什么?

  • 我正在使用java中的MySQL库执行一个查询。在我的数据库结构中,有一列名为(主键,非空且自动递增)。通常在每次插入查询中,我都将值设置为,在查询执行后,它会增加最后一个id,但在java中这样做会给我异常。 这就是代码: 如何使用自动增量ID执行查询?

  • 问题内容: 我想创建一个新集合,并向其中添加成千上万个大小约为1-2K的文档。我已经在json中保存了数据,因此我认为这很容易。 我知道该批处理一次可以写入500次,因此为了将其分成500块,我编写了以下代码。虽然出于测试目的,我以20个块运行它,而我的测试json有72个对象。 但我不断收到以下错误 我的代码如下 同样奇怪的是,似乎没有在循环的每次迭代中都提交批处理。理想情况下,我会让Fires

  • 问题内容: 我了解对此主题有很多疑问。但是我仍然有些困惑,不确定何时使用这些操作。我正在为参加考试而做的旧考试。其中一种方法返回可访问的残疾人可用教室的数量。我编写了counter方法,但不确定是应该先递增还是递后递增计数器。我对它如何与方法中的return语句混淆。我仍然不知道该方法将在下面返回什么值。其他问题未在方法中显示返回值,因此我对它的工作方式感到困惑。这是代码: 问题答案: 当您要在表