在做项目时,需要加载40442张图片,出现内存错误:MemoryError: Unable to allocate 4.34 GiB for an array with shape (40442, 80, 60, 3) and data type float64
。错误源代码:
data = np.array(data, dtype="float") / 255.0# 默认float64
记录几种查到的解决策略。
一般计算上通过numpy得到的16位浮点数。float64占用的内存是float32的两倍,是float16的4倍,比如对于CIFAR10数据集,如果采用float64来表示,需要 60000 ∗ 32 ∗ 32 ∗ 3 ∗ 8 / 1024 ∗ ∗ 3 = 1.4 G 60000*32*32*3*8/1024**3=1.4G 60000∗32∗32∗3∗8/1024∗∗3=1.4G,光把数据集调入内存就需要1.4G;如果采用float32,只需要0.7G,如果采用float16,只需要0.35G左右。占用内存的多少,会对系统运行效率有严重影响,因此数据集文件都是采用uint8来存在数据,保持文件最小。
Python 32bit 最大只能使用 2G 内存。32位的Python安装的pandas和Numpy也只能是32位的,那么当内存使用超过2G时,就会自动终止内存,而 64bit python则无此限制。
python
。内存使用率不高,但出现MemoryError,可能存在内存限制。
-Xmx750m
为 -Xmx4096m
分配4G内存,视情况而定;具体设置:
物理内存与虚拟内存:
物理内存
虚拟内存
即便你的内存已经大到“无可救药”的地步,也不应该将虚拟内存关闭,因为除了传统的为RAM“后备”这一功能外,Windows也会利用虚拟内存执行一 些特定操作。此外虚拟内存的打开还有助于提高内存命中率及保证系统稳定,个别软件(如Photoshop、3Dmark等)在运行时也会需要虚拟内存。
电脑,虚拟内存,物理内存,有什么区别。,哪个更好。| 内存管理介绍
关于 TensorFlow 读取数据的方法,官网给出了三种方法:
用户处理输入数据的典型流程是:首先将输入数据集从文件系统种读取到内存中,然后将其转换为模型需要的输入数据格式,接着以某种方式传入数据流图,继而开始真正的模型训练过程。
输入数据集一般被存储在各种类型的文件系统中,根据文件系统类型和输入数据集大小,有两种不同的数据读取方法:
在数据是稀疏的情况下,如训练集中大量one hot特征,此时把dense的数据转成sparse的存储方式可以减小内存占用,可以参考scipy里面的sparse模块,里面有多种支持sparse存储的数据结构可以直接调用。但是注意该模块的集中数据结构至少都需要dense数据2-3倍的空间来存储,也就是说,如果数组中sparse的只有一半甚至更少,那使用sparse结构只会占用更多的空间,只有在数据中大量都是稀疏的情况下才能用。
python处理大训练集过程中遇到的Memory Error问题解决
with open(path) as f:
data = pd.read_csv(path, sep=',',engine = 'python',iterator=True)
loop = True
index,chunkSize,chunks = 0,1000,[]
while loop:
try:
print(index)
chunk = data.get_chunk(chunkSize)
chunks.append(chunk)
index+=1
except StopIteration:
loop = False
print("Iteration is stopped.")
print('开始合并')
data = pd.concat(chunks, ignore_index= True)
read()
:一次性读取文件的全部内容,如果文件很小,一次性读取最方便;read(size)
:每次最多读取size个字节的内容,如果不能确定文件大小,反复调用read(size)比较保险;readline()
:每次读取一行内容;readlines()
:一次读取所有内容并按行返回list,如果是配置文件,调用readlines()最方便:处理大文件是很容易想到的就是将大文件分割成若干小文件处理,处理完每个小文件后释放该部分内存。
def read_in_chunks(filePath, chunk_size=1024*1024):
"""
Lazy function (generator) to read a file piece by piece.
Default chunk size: 1M
You can set your own chunk size
"""
with open(filePath) as file_object:
while True:
chunk_data = file_object.read(chunk_size)
if not chunk_data:
break
yield chunk_data
if __name__ == "__main__":
filePath = './path/filename'
for chunk in read_in_chunks(filePath):
process(chunk) #
批量读写HDF5文件:Python处理HDF5文件:h5py库
TFRecords 格式和 h5py 格式是类似的效用。
TensorFlow学习笔记之30分钟学会 TFRecords 格式高效处理数据
tensorflow TFRecords文件的生成和读取方法
Python的垃圾回收机制比较懒惰,有时候在一个for循环中的变量用完不会回收,下次重新初始化的时候又重新开辟了空间,这时候可以手动del这个变量,del x
,然后import gc
, 然后手动gc.collect()
。
Python学习:numpy库 数据量太大出现Memory Error问题的解决方法汇总
win10 pycharm 出现MemoryError 和 Unable to allocate array with shape