马春杰杰 Exit Reader Mode

RuntimeError: [enforce fail at CPUAllocator.cpp:64] . DefaultCPUAllocator: can’t allocate memory

今天来说个错误,看下面:

(detect_mcj)  
840 3 2160 3840
Traceback (most recent call last):
  File "CNN.py", line 186, in <module>
    current_data = dataset[i]
  File "CNN.py", line 57, in __getitem__
    transformed_video = torch.zeros([video_length, video_channel,  video_height, video_width])
RuntimeError: [enforce fail at CPUAllocator.cpp:64] . DefaultCPUAllocator: can't allocate memory: you tried to allocate 83607552000 bytes. Error code 12 (Cannot allocate memory)

这句代码是新建一个视频帧大小的数据块,目前电脑内存是32G,之前处理1080P或者720P视频的时候一直没问题,最近处理的视频比较大,报了:

RuntimeError: [enforce fail at CPUAllocator.cpp:64] . DefaultCPUAllocator: can't allocate memory: you tried to allocate 83607552000 bytes. Error code 12 (Cannot allocate memory)

这个错很明显就是内存不足的问题,我们来看一下内存占用的计算方法83607552000=840*3*2160*3840*4

这里乘以4是因为一个字节占用4个二进制位。所以,解决上述错误的方法有两个,一是增大内存,二是缩小视频帧的尺寸。

再说下二吧,缩小视频帧的尺寸也有很多种方法,这里我选择边缩小边计算,推荐个包:moviepy

一个简单的用法是:

import moviepy.editor as mp
clip = mp.VideoFileClip("movie.mp4")
clip_resized = clip.resize(height=1080) # 宽为1080,并保持比例不变
clip_resized.write_videofile("movie_resized.mp4")

 

本文最后更新于2021年5月23日,已超过 1 年没有更新,如果文章内容或图片资源失效,请留言反馈,我们会及时处理,谢谢!