微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

追加大型 Pytables HDF5 文件的最快方法

如何解决追加大型 Pytables HDF5 文件的最快方法

我使用多处理来生成大量非常大的 Pytables (H5) 文件——大到足以在单次扫描时出现内存问题。这些文件中的每一个都是使用 tb.create_table 创建的,以允许 3 列具有混合数据类型——前两列是整数,第三列是浮点数(例如 here)。每个文件中的总行数可以不同。

我想将这些 H5 文件合并为一个 H5 文件;所有单独的 H5 都有 datset_1,需要将其附加到新 H5 文件中的单个数据集。

修改了给出 here 的答案。就我而言,我以块的形式读取/附加每个文件/数据集到组合的 H5 文件中。想知道是否有计算速度更快(或干净)的方法来完成这项工作?

我从 /output/ 目录中获取 H5 文件的最小工作代码和示例输出如下:

import os
import numpy as np
import tables as tb

# no. of rows to read per chunk
factor = 10**7

# gather files to combine
file_lst = []
for fl in os.listdir('output/'):
    if not fl.startswith('combined'):
        file_lst.append(fl)

# combined file name
file_cmb = tb.open_file('output/combined.h5','w')
# copy file-1 dataset to new file
file1 = tb.open_file(f'output/{file_lst[0]}','r')
z = file1.copy_node('/',name='dataset_1',newparent=file_cmb.root,newname='dataset_1')
print(f'File-0 shape: {file1.root.dataset_1.shape[0]}')

for file_idx in range(len(file_lst)):
    if file_idx>0:
        file2 = tb.open_file(f'output/{file_lst[file_idx]}','r')
        file2_dset = file2.root.dataset_1
        shape = file2_dset.shape[0]
        print(f'File-{file_idx} shape: {shape}')

        # determine number of chunks_loops to read entire file2
        if shape<factor:
            chunk_loop = 1
        else:
            chunk_loop = shape//factor

        size_int = shape//chunk_loop
        size_arr = np.repeat(size_int,chunk_loop)

        if shape%chunk_loop:
            last_size = shape % chunk_loop
            size_arr = np.append(size_arr,last_size)
            chunk_loop += 1

        chunk_start = 0
        chunk_end = 0

        for alpha in range(size_arr.shape[0]):
            chunk_end = chunk_end + size_arr[alpha]
            z.append(file2_dset[chunk_start:chunk_end])
            chunk_start = chunk_start + size_arr[alpha]
        file2.close()

print(f'Combined file shape: {z.shape}')
file1.close()
file_cmb.close()

示例输出

File-0 shape: 787552
File-1 shape: 56743654
File-2 shape: 56743654
File-3 shape: 56743654
Combined file shape: (171018514,)

解决方法

你的想法是对的。我更喜欢用于文件处理的上下文管理器,并且循环和制作增量副本的逻辑很难遵循(并且您不需要数组 - 您可以即时进行计算)。我开始尝试重构。但是,没有输入文件,我无法调试,所以可能会出现一些小错误。

private fun showTimePicker() {
    picker = MaterialTimePicker.Builder()
            .setTimeFormat(TimeFormat.CLOCK_12H)
            .setHour(12)
            .setMinute(0)
            .setTitleText("حدد الموعد الذي تريدة")
            .build()

    picker.show(supportFragmentManager,"AdhanNotifacations")
    picker.addOnPositiveButtonClickListener {
        if (picker.hour > 12) {
            fajrEditTxt.setHint(String.format("%02d",picker.hour - 12) + ":"
                    + String.format("%02d",picker.minute) + " PM")
        } else {
            fajrEditTxt.setHint(String.format("%02d",picker.hour) + ":"
                    + String.format("%02d",picker.minute) + " AM")
        }
        calender = Calendar.getInstance()
        calender[Calendar.HOUR_OF_DAY] = picker.hour
        calender[Calendar.MINUTE] = picker.minute
        calender[Calendar.SECOND] = 0
        calender[Calendar.MILLISECOND] = 0
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?