如何解决追加大型 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 举报,一经查实,本站将立刻删除。