保存到 hdf5 非常慢(Python 冻结)

2023-11-25

我正在尝试将瓶颈值保存到新创建的 hdf5 文件中。 瓶颈值呈批量形状(120,10,10, 2048)。 单独保存一个批次就占用了超过 16 个千兆字节,而 Python 似乎在该批次上冻结了。根据最近的发现(请参阅更新,似乎 hdf5 占用大内存是可以的,但冻结部分似乎是一个小故障。

我只是想拯救第一个2批次用于测试目的,并且仅 训练数据集(再次,这是一个测试运行),但我什至无法通过第一批。它只是在第一批中停止,并且不会循环到下一次迭代。如果我尝试检查 hdf5,资源管理器将变得缓慢,Python 将冻结。如果我尝试终止 Python(即使不检查 hdf5 文件),Python 也不会正确关闭,并且会强制重新启动。

以下是相关代码和数据:

总数据点约为 90,000 个左右,分 120 个批次发布。

Bottleneck shape is (120,10,10,2048)

所以我要保存的第一批是(120,10,10,2048)

以下是我尝试保存数据集的方法:

with h5py.File(hdf5_path, mode='w') as hdf5:
                hdf5.create_dataset("train_bottle", train_shape, np.float32)
                hdf5.create_dataset("train_labels", (len(train.filenames), params['bottle_labels']),np.uint8)
                hdf5.create_dataset("validation_bottle", validation_shape, np.float32)
                hdf5.create_dataset("validation_labels",
                                              (len(valid.filenames),params['bottle_labels']),np.uint8)



 #this first part above works fine

                current_iteration = 0
                print('created_datasets')
                for x, y in train:

                    number_of_examples = len(train.filenames) # number of images
                    prediction = model.predict(x)
                    labels = y
                    print(prediction.shape) # (120,10,10,2048)
                    print(y.shape) # (120, 12)
                    print('start',current_iteration*params['batch_size']) # 0
                    print('end',(current_iteration+1) * params['batch_size']) # 120

                    hdf5["train_bottle"][current_iteration*params['batch_size']: (current_iteration+1) * params['batch_size'],...] = prediction
                    hdf5["train_labels"][current_iteration*params['batch_size']: (current_iteration+1) * params['batch_size'],...] = labels
                    current_iteration += 1
                    print(current_iteration)
                    if current_iteration == 3:
                       break

这是打印语句的输出:

(90827, 10, 10, 2048) # print(train_shape)

(6831, 10, 10, 2048)  # print(validation_shape)
created_datasets
(120, 10, 10, 2048)  # print(prediction.shape)
(120, 12)           #label.shape
start 0             #start of batch
end 120             #end of batch

# Just stalls here instead of printing `print(current_iteration)`

它只是在这里停滞一段时间(20 分钟以上),并且 hdf5 文件的大小缓慢增长(现在大约 20 GB,在我强行杀死之前)。实际上,我什至无法使用任务管理器强制杀死,我必须重新启动操作系统,才能在这种情况下真正杀死Python。

Update

在玩了一下我的代码后,似乎有一个奇怪的错误/行为。

相关部分在这里:

          hdf5["train_bottle"][current_iteration*params['batch_size']: (current_iteration+1) * params['batch_size'],...] = prediction
                hdf5["train_labels"][current_iteration*params['batch_size']: (current_iteration+1) * params['batch_size'],...] = labels

如果我运行其中任何一行,我的脚本将进行迭代,并按预期自动中断。因此,如果我运行“非此即彼”,则不会冻结。它发生得也相当快——不到一分钟。

如果我运行第一行('train_bottle'),我的内存占用了大约 69-72 gig,即使只是几个批次。如果我尝试更多批次,内存是相同的。所以我假设train_bottle根据我分配数据集的大小参数决定存储,而不是实际上当它被填充时。 因此,尽管有 72 场演出,但它的运行速度相当快(一分钟)。

如果我运行第二行,train_labels,我的内存占用了几兆。 迭代没有问题,执行break语句。

然而,现在问题是,如果我尝试运行这两行(在我的情况下这是必要的,因为我需要保存“train_bottle”和“train_labels”),我在第一次迭代时遇到冻结,并且它即使在 20 分钟后,也不会继续进行第二次迭代。 Hdf5 文件正在缓慢增长,但如果我尝试访问它,Windows 资源管理器会慢如蜗牛,而且我无法关闭 Python - 我必须重新启动操作系统。

所以我不确定尝试运行两条线时出现什么问题——就好像我运行内存很饿一样train_data线路,如果工作正常并在一分钟内结束。


将数据写入HDF5

如果您写入分块数据集而不指定分块形状,h5py 将自动为您执行此操作。由于 h5py 无法知道如何从数据集中写入或读取数据,因此这通常会导致性能不佳。

您还可以使用默认的 chunk-cache-size 1 MB。如果您只写入块的一部分,并且该块不适合缓存(这很可能是 1MP 块缓存大小),则整个块将在内存中读取、修改并写回磁盘。如果这种情况发生多次,您将看到性能远远超出 HDD/SSD 的顺序 IO 速度。

在下面的示例中,我假设您仅沿着第一个维度进行读取或写入。如果不是,则必须根据您的需要进行修改。

import numpy as np
import tables #register blosc
import h5py as h5
import h5py_cache as h5c
import time

batch_size=120
train_shape=(90827, 10, 10, 2048)
hdf5_path='Test.h5'
# As we are writing whole chunks here this isn't realy needed,
# if you forget to set a large enough chunk-cache-size when not writing or reading 
# whole chunks, the performance will be extremely bad. (chunks can only be read or written as a whole)
f = h5c.File(hdf5_path, 'w',chunk_cache_mem_size=1024**2*200) #200 MB cache size
dset_train_bottle = f.create_dataset("train_bottle", shape=train_shape,dtype=np.float32,chunks=(10, 10, 10, 2048),compression=32001,compression_opts=(0, 0, 0, 0, 9, 1, 1), shuffle=False)
prediction=np.array(np.arange(120*10*10*2048),np.float32).reshape(120,10,10,2048)
t1=time.time()
#Testing with 2GB of data
for i in range(20):
    #prediction=np.array(np.arange(120*10*10*2048),np.float32).reshape(120,10,10,2048)
    dset_train_bottle[i*batch_size:(i+1)*batch_size,:,:,:]=prediction

f.close()
print(time.time()-t1)
print("MB/s: " + str(2000/(time.time()-t1)))

Edit循环中的数据创建花费了相当多的时间,因此我在时间测量之前创建数据。

这应该提供至少 900 MBps 的吞吐量(CPU 限制)。使用真实数据和较低的压缩比,您应该可以轻松达到硬盘的顺序 IO 速度。

如果您错误地多次调用此块,则使用 with 语句打开 HDF5 文件也可能导致性能不佳。这将关闭并重新打开文件,删除块缓存。

为了确定正确的块大小,我还建议:https://stackoverflow.com/a/48405220/4045774 https://stackoverflow.com/a/44961222/4045774

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

保存到 hdf5 非常慢(Python 冻结) 的相关文章

  • 如何打印前面有一定数量空格的整数?

    C has printf Xd Y 它只打印整数 X 并使其在控制台窗口上占据 Y 空格 例如 printf 3d 10 console 10 printf 5d 5 console 5 我如何在 python 3 中使用它 This pr
  • 创建 xyz 海拔数据的曲面图

    我正在尝试用 python 创建一座山的表面图 其中我有一些 xyz 数据 最终结果应该类似于that https i stack imgur com rKQV0 png 该文件的格式如下 616000 0 90500 0 3096 712
  • 打印出网络架构中每一层的形状

    在 Keras 中 我们可以如下定义网络 有什么办法可以输出每层之后的形状 例如 我想打印出以下形状inputs在定义行之后inputs 然后打印出形状conv1在定义行之后conv1 etc inputs Input 1 img rows
  • 我可以同时打开两个 Tkinter Windows 吗?

    可以同时打开2个窗口吗 import tkinter as Tk import random import math root Tk Tk canvas Tk Canvas root background image Tk PhotoIma
  • NumPy 数组与 SQLite

    我在 Python 中见过的最常见的 SQLite 接口是sqlite3 但是有什么东西可以很好地与 NumPy 数组或 rearray 配合使用吗 我的意思是 它可以识别数据类型 不需要逐行插入 并提取到 NumPy rec 数组中 有点
  • Python Apache Beam 端输入断言错误

    我对 Apache Beam Cloud Dataflow 还很陌生 所以如果我的理解不正确 我深表歉意 我正在尝试通过管道读取大约 30 000 行长的数据文件 我的简单管道首先从 GCS 打开 csv 从数据中提取标题 通过 ParDo
  • 对法语文本进行词形还原[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一些法语文本需要以某种方式进行处理 为此 我需要 首先 将文本标记为单词 然后对这些单词进行词形还原以避免多次处理相同的词根 据我
  • 将列表值转换为 pandas 中的行

    我有数据帧 其中一列具有相同长度的 numpy ndarray 值 df list 0 Out 92 array 0 0 0 0 29273096 0 30691767 0 27531403 我想将这些列表值转换为数据框并从 df iloc
  • lmfit模型拟合然后预测

    我正在领养lmfit进行曲线拟合并使用拟合模型进行预测 然而下面的代码并没有达到我想要的效果 能否请你帮忙 谢谢 import numpy as np from lmfit import Model def linearModel x a0
  • 如何在Python中手动对数字列表进行排序?

    规格 Ubuntu 13 04 Python 3 3 1 背景 Python的初学者 遇到了这个 手动排序 问题 我被要求做的事情 让用户输入 3 个数值并将它们存储在 3 个不同的变量中 不使用列表或排序算法 手动将这 3 个数字从小到大
  • Python FTP下载550错误

    我编写了一个 ftp 爬虫来下载特定文件 它会一直工作 直到找到要下载的特定文件 然后抛出此错误 ftplib error perm 550 该文件存在于我的下载文件夹中 但文件大小为 0 kb 我需要转换某些内容才能下载吗 我可以访问 f
  • 使用 Python-VLC 的 PyInstaller:无属性“media_player_new”错误

    我使用 Python VLC 创建视频播放器 并使用 PyInstaller 在 Windows 10 计算机上生成可执行文件 最初 它给了我错误 Import Error Failed to load dynlib dll libvlc
  • 在python中使用编解码器utf-8打开文件错误

    我在 windows xp 和 python 2 6 4 上执行以下代码 但它显示 IOError 如何打开名称带有 utf 8 编解码器的文件 gt gt gt open unicode txt euc kr encode utf 8 T
  • Python GTK3 Treeview 向上或向下移动选择

    如何在树视图中向上或向下移动所选内容 我的想法是 我可以使用向上和向下按钮将选择向上移动一行或向下移动一行 我的 Treeview 使用 ListStore 不确定这是否重要 首先 我将使用我熟悉的 C 代码 如果您在将其翻译为 Pytho
  • 如何将 pandas DataFrame 转换为 TimeSeries?

    我正在寻找一种将 DataFrame 转换为 TimeSeries 而不拆分索引和值列的方法 有任何想法吗 谢谢 In 20 import pandas as pd In 21 import numpy as np In 22 dates
  • 解析整数集的字符串并列出间隔

    I have 2 5 7 9 12 string 我想从中获取 2 5 7 8 9 12 列表 python中有没有内置的函数 Thanks UPD 我想 直接的答案是No 不管怎样 谢谢你的 片段 使用一个 建议者斯文 马尔纳克 s 2
  • Django 中使用外键的抽象基类继承

    我正在尝试在 Django 支持的网站上进行模型继承 以遵守 DRY 我的目标是使用一个名为 BasicCompany 的抽象基类来为三个子类提供通用信息 Butcher Baker CandlestickMaker 它们位于各自的应用程序
  • 如何创建简单的梯度下降算法

    我正在研究简单的机器学习算法 从简单的梯度下降开始 但在尝试用 python 实现它时遇到了一些麻烦 这是我试图重现的示例 我获得了有关房屋的数据 居住面积 以英尺为单位 和卧室数量 以及最终的价格 居住面积 英尺2 2104 卧室 3 价
  • 在自定义 keras 层的调用函数中传递附加参数

    我创建了一个自定义 keras 层 目的是在推理过程中手动更改前一层的激活 以下是基本层 它只是将激活值乘以一个数字 import numpy as np from keras import backend as K from keras
  • 将二进制数转换为包含每个二进制数的数组

    我试图将二进制值转换为每个 1 0 的列表 但我得到默认的二进制值而不是列表 我有一个字符串 我将每个字符转换为二进制 它给了我一个列表 其中每个字符都有一个字符串 现在我试图将每个字符串拆分为值为 0 1 的整数 但我什么也得不到 if

随机推荐

  • Mapstruct LocalDateTime 到 Instant

    我是 Mapstruct 的新手 我有一个模型对象 其中包括LocalDateTime类型字段 DTO 包括Instant类型字段 我想要地图LocalDateTime将字段键入Instant类型字段 我有TimeZone传入请求的实例 像
  • 使用 javamail 的 IMAP 访问邮件 Office 365

    我正在尝试使用 JavaMail 1 4 api 读取电子邮件帐户 Office365 的文件夹中的电子邮件 我的代码是 public static void main String argv throws Exception Get a
  • FFMPEG:如何以高关键帧间隔对可搜索视频进行编码

    我正在寻找一个 ffmpeg 命令 如果我在 requestAnimationFrame 上控制视频以进行鼠标控制 则该命令最适合使用 基本上 它需要快速搜索并以高关键帧间隔进行编码 我似乎无法确定哪些参数有助于快速搜索和高关键帧 谢谢 约
  • GCD 和线程过多的问题

    我有一个图像加载器类 它提供 NSURL 加载和来自网络的图像并执行完成块 代码其实很简单 void downloadImageWithURL NSString URLString completion BELoadImageComplet
  • 解析 NSURL 查询属性

    我有一个像这样的网址myApp action 1 parameter 2 secondparameter 3 通过属性查询 我得到了以下部分URL parameter 2 secondparameter 3 有什么方法可以轻松地将其放入NS
  • 如何向一个号码发送多条短信

    我想通过使用复选框选择发送多条短信 仅选定的短信内容 即它们的正文需要发送新的消息正文到我预定义的 121 但下面的代码 无论我是否选择 否 121 它都会发送完整的收件箱消息 主要活动代码 public class MainActivit
  • Tomcat如何处理多个请求

    我知道创建网络应用程序 但我有一个基本的疑问 我很抱歉问了非常愚蠢的问题 但想消除我的疑虑 Tomcat容器如何处理请求 我的意思是当我发送请求时home jsp页面然后我得到的响应为home jsp仅页面而不是注册 jsp该页面同时可能是
  • 每当视图寻呼机中的选项卡发生更改时如何更新列表

    在我的应用程序中 我使用视图寻呼机来使用导航选项卡 我已经能够使用发布的代码成功绘制选项卡 https github com codepath android guides wiki Sliding Tabs with PagerSlidi
  • Gson 和抽象超类:反序列化问题

    假设有一个abstract类 说A 以及两个非抽象子类 例如A1 and A2 我想使用 json 格式 反序列化 它们GSON库 例如 我得到一个数组A对象 int n A list new A n A 0 new A1 A 1 new
  • 使用 CLI 通过 HTTPS 运行 Flask 开发服务器

    我正在尝试使用 HTTPS 来提供 Flask 应用程序flask命令 我可以使用以下方法来做到这一点app run通过通过ssl context争论 但我不知道如何在 CLI 上执行此操作 flask run host 0 0 0 0 p
  • 如果多个线程同时修改 NSMutableArray 会发生什么? (如果它包含的对象保留在其他地方)

    我有一个包含许多对象的 NSMutableArray 如果在我使用 NSMutableArray array With Array some Array 复制数组时对数组进行更改 会发生什么情况 例如 如果在复制时从数组中删除一个对象 我不
  • AngularJS limitTo 过滤对象上的 ngRepeat(像字典一样使用)

    是否可以使用limitTo过滤在ngRepeat指令重复对象的属性而不是数组中的项目 我知道官方文档说输入limitTo需要是数组或字符串 但想知道是否有办法让它发挥作用 这是示例代码 li li And scope phones dict
  • jQuery UI 自动完成文本框中的多个值

    我需要一种简单的自动完成搜索功能 但也允许用户输入多个值 我正在使用 jQuery UI 的自动完成小部件 http jqueryui com autocomplete 到目前为止 我已将源设置为仅搜索建议中的第一个字母 我现在想添加的是用
  • 如何获取 FxCop 中 callvirt IL 指令实际调用的方法

    我仍在努力让我的 FxCop 规则发挥作用 作为其中的一部分 我需要弄清楚方法调用哪些方法 以前我用的是CallGraph CallersFor 相反地做 无论如何这是我的最终目标 但是它似乎有我下面描述的相同问题 作为使用的替代方案Cal
  • 如何在asp.net中使用__doPostBack函数

    我正在尝试使用 doPostBack函数 这样我就可以强制我的页面在页面加载时进行后包 但我在理解上遇到一些困难 当我在网上查看示例时 单击按钮时 我想发回帖子 但不确定如何完成后面代码中的代码 这是我到目前为止所拥有的 这是我的按钮
  • 0x80040154 的 COMException 是否总是“类未注册”?

    0x80040154 的 System Runtime InteropServices COMException 是否始终意味着该类未注册 我收到一个 COMException 其中显示 由于以下错误 检索具有 CLSID 29131539
  • “npm ci”抛出异常:无法读取未定义的属性“长度”

    我在本地环境和 CircleCI 中都遇到了这个异常 gt email protected postinstall home vallo project node modules core js gt node e try require
  • nginx - 基于请求标头的响应

    我安装了 nginx 1 0 8 这是我的问题 我有 2 个文件 file1 js and file2 js 请求的路径是这样的 www mysite com files dir user file js 如果请求的标头 X Header
  • Discover 信用卡的正则表达式

    我已读完这个问题 但对于 Discover 卡 起始数字是6011 622126 622925 644 649 65而不仅仅是6011 65 Source 对于发现卡 我从该问题中选择了这个正则表达式 6 011 5 0 9 2 0 9 1
  • 保存到 hdf5 非常慢(Python 冻结)

    我正在尝试将瓶颈值保存到新创建的 hdf5 文件中 瓶颈值呈批量形状 120 10 10 2048 单独保存一个批次就占用了超过 16 个千兆字节 而 Python 似乎在该批次上冻结了 根据最近的发现 请参阅更新 似乎 hdf5 占用大内