首页 > 编程问答 >在 Python 中转换为 np.array 时的内存饱和与内核重启

在 Python 中转换为 np.array 时的内存饱和与内核重启

时间:2024-05-30 15:49:42浏览次数:24  
标签:python arrays numpy out-of-memory large-data

在将处理过的数据转换为 numpy 数组时,我遇到了内存问题。我有 57GB 内存,但内存很快就饱和了,内核会在 np.array(processed_X) 处重启。以下是我的代码:

import numpy as np
导入 scipy.signal
from skimage.transform import resize
from tqdm import tqdm

def apply_stft(signal, nperseg=256, noverlap=128):
    f、t、Zxx = scipy.signal.stft(signal, nperseg=nperseg, noverlap=noverlap)
    返回 np.abs(Zxx)

def resize_stft(stft_result, output_shape=(224, 224)):
    return resize(stft_result, output_shape, mode='constant')

def process_dataset(X):
    processed_X = []
    for example in tqdm(X):
        stft_results = [apply_stft(example[:, i]) for i in range(example.shape[1])
        resized_stft = [Resize_stft(stft) for stft in stft_results] (stft_results中的stft)
        stacked_stft = np.stack(resized_stft, axis=-1)
        processed_X.append(stacked_stft)
        del stft_results,resized_stft,stacked_stft
    print(len(processed_X))
    print('FINISHED !!!')
    return np.array(processed_X)

当代码执行到 np.array(processed_X) 时,我的内存使用率迅速飙升,最终耗尽所有可用内存并导致内核重启。我如何才能避免这一内存问题?

感谢您的帮助!

采取的步骤:

    尝试删除中间变量以释放内存。
  • 验证了问题发生在 np.array(processed_X) 行。

代码在处理大量数据时遇到内存问题的原因是,它将所有已处理的数据存储在一个名为 processed_X 的 Python 列表中,然后尝试一次性将该列表转换为 NumPy 数组。这会导致巨大的内存分配,从而使的系统不堪重负。

可以通过以下方法解决此问题,而无需一次性将所有数据加载到内存中

  1. 使用内存映射文件:内存映射文件允许通过将文件映射到内存来处理大于可用内存的数据集。可以使用 numpy.memmap 创建一个空的内存映射文件,然后在处理每个示例时将处理后的数据逐步写入该文件。

```python import numpy as np import scipy.signal from skimage.transform import resize from tqdm import tqdm

def apply_stft(signal, nperseg=256, noverlap=128): f, t, Zxx = scipy.signal.stft(signal, nperseg=nperseg, noverlap=noverlap) return np.abs(Zxx)

def resize_stft(stft_result, output_shape=(224, 224)): return resize(stft_result, output_shape, mode='constant')

# 获取处理后的数据的形状 example_shape = None # 将其替换为处理后的单个示例的形状

# 创建一个空的内存映射数组 processed_X = np.memmap('processed_data.dat', dtype='float32', mode='w+', shape=(len(X), *example_shape))

def process_dataset(X): for i, example in enumerate(tqdm(X)): stft_results = [apply_stft(example[:, j]) for j in range(example.shape[1])] resized_stft = [resize_stft(stft) for stft in stft_results] stacked_stft = np.stack(resized_stft, axis=-1) # 将处理后的数据直接写入内存映射数组 processed_X[i] = stacked_stft print('FINISHED !!!') return processed_X

processed_X = process_dataset(X) ```

这将创建一个名为 processed_data.dat 的文件,其中包含已处理的数据。可以像处理常规 NumPy 数组一样访问和处理此内存映射数组,而无需将其全部加载到内存中。

  1. 使用生成器进行批处理:将数据分成较小的批次,并使用生成器一次处理一批。这将减少内存使用量,因为一次只会在内存中保留一小部分数据。

```python def process_batch(X_batch): processed_batch = [] for example in X_batch: stft_results = [apply_stft(example[:, i]) for i in range(example.shape[1])] resized_stft = [resize_stft(stft) for stft in stft_results] stacked_stft = np.stack(resized_stft, axis=-1) processed_batch.append(stacked_stft) return np.array(processed_batch)

def data_generator(X, batch_size): for i in range(0, len(X), batch_size): yield X[i:i + batch_size]

batch_size = # 选择合适的批次大小 for X_batch in data_generator(X, batch_size): processed_batch = process_batch(X_batch) # 使用处理后的批次执行其他操作,例如将其保存到磁盘或将其馈送到模型中 ```

这允许以较小的块的形式处理数据,从而防止内存不足错误。

请记住,最佳方法取决于的特定需求和数据大小。如果的数据仍然太大,请考虑使用分布式计算框架(如 Dask 或 Spark)来跨多台机器分配处理。

标签:python,arrays,numpy,out-of-memory,large-data
From: 78553578

相关文章

  • 【爬虫软件】用Python开发的小红书详情批量采集工具,含笔记正文、转评赞藏等
    一、背景介绍1.1爬取目标用python开发的爬虫采集软件,可自动按笔记链接抓取笔记的详情数据。为什么有了源码还开发界面软件呢?方便不懂编程代码的小白用户使用,无需安装python,无需改代码,双击打开即用!软件界面截图:爬取结果截图:结果截图1:结果截图2:结果截图3:以上。1.2......
  • Linux有关环境搭建使用python简化操作
    我用这种方式安装过z.lua,好用;记录一些常用的api:api记录获取用户主目录home_dir=os.path.expanduser("~")获取脚本文件的绝对路径zlua_path=os.path.abspath(__file__)zlua_dir=os.path.dirname(zlua_path)构建路径字符串#构建目标文件路径target_dir=......
  • 《少年小鱼的魔法之旅——神奇的Python》,在悬疑和冒险中学会Python编程,Python启蒙入门
    ​故事简介在一个普通的城市里,生活着一个名叫小鱼的初中少年。他学习成绩在班里倒数,同学们都嘲笑他,他每天非常苦恼。一天放学回家的路上,他意外地捡到了一台黑色的笔记本电脑。他好奇地打开电脑,从此被卷入了一个神奇的魔法世界。这个世界里,编程是一种魔法咒语,能够创造出无限的奇......
  • 系统中存在多个python出现的一些问题
    问题:因为系统有好几个python.exe文件,所以在使用python的时候出现了很多问题有没有出现过一个问题就是在pycharm里面选用的是3.11的版本,然后这个pycharm下载问题太多了,就想去windows命令窗口或者是pycharm的terminal中通过whl文件下载,但是下载后却不在python3.11的lib\site-packag......
  • lammps统计六元环(非苯环)个数--Python实现
    思路1、六元碳环中,两原子最远距离为3X1.7=5.12、六个碳原子的集合中,每个碳原子彼此之间都只成两个C-C键的情况。只有一种可能————碳原子之间首尾相连连成六元环步骤1、找出距离目标原子距离<=5的所有原子,建立一个包含n个原子列表2、在列表中随机取六个原子,建立一个小......
  • numpy
    Numpy(NumericalPython)是一个开源的Python科学计算库,用于快速处理任意维度的数组。Numpy支持常见的数组和矩阵操作。对于同样的数值计算任务,使用Numpy比直接使用Python要简洁的多。Numpy使用ndarray对象来处理多维数组,该对象是一个快速而灵活的大数据容器。Numpy—数值......
  • Python+Py可执行程序适配win7系统(完美简单解决)
           之前用python3.11+pyqt5开发的可执行程序,在win7执行报错,尝试了多种方法,通过降低python版本,pyqt5版本以及打包时包含相应外部库等方式,执行时均出现报错。报错情况:        1.如果你系统相关vc++支持库都已安装,执行时报错:缺少api-ms-win-core-path-......
  • *Python中的`__str__`与`__repr__`:深入理解与最佳实践
    Python中的__str__与__repr__:深入理解与最佳实践在Python的面向对象编程中,__str__和__repr__是两个重要的魔法方法(也称为特殊方法或双下划线方法)。它们用于定义对象的字符串表示形式,但各自的目的和用途有所不同。本文将深入探讨__str__和__repr__方法之间的区别,并提供实用......
  • *Python中的`__init__`方法:类的初始化与魔法
    Python中的__init__方法:类的初始化与魔法在Python的面向对象编程中,__init__方法扮演着至关重要的角色。它被称为类的构造函数或初始化方法,当创建类的新实例时,会自动被调用。__init__方法允许开发者在创建对象时设置初始状态或执行其他必要的初始化操作。本文将深入解析__in......
  • python pip相关问题
    一、解决下载慢的问题1、问题分析单纯的使用pip安装插件或模块,下载速度慢的可怜,安装torch用了半个多小时,所以就想着去解决这个问题,提升一下效率。2、解决办法(1)下载时加入参数-i[镜像源地址]pipinstall-ihttps://pypi.tuna.tsinghua.edu.cn/simpletorch或者pi......