有人知道numpy ndarray使用了多少内存?(假设有10,000,000个浮动元素).
我正在开发一个项目,涉及使用python来读取,处理和写入有时大到几百兆字节的文件.当我尝试处理一些特别大的文件时,程序偶尔会失败.它没有说'记忆错误',但我怀疑这是问题(实际上它根本没有理由失败').
我一直在测试较小文件上的代码并观察"顶部"以查看内存使用情况,并且通常达到60%.top说我的总内存为4050352k,所以3.8Gb.
同时我正在尝试使用以下一小段代码跟踪python本身的内存使用情况(请参阅我昨天的问题):
mem = 0
for variable in dir():
variable_ = vars()[variable]
try:
if str(type(variable_))[7:12] == 'numpy':
numpy_ = True
else:
numpy_ = False
except:
numpy_ = False
if numpy_:
mem_ = variable_.nbytes
else:
mem_ = sys.getsizeof(variable)
mem += mem_
print variable+ type: '+str(type(variable_))+' size: '+str(mem_)
print 'Total: '+str(mem)
Run Code Online (Sandbox Code Playgroud)
在我运行该块之前,我将所有不需要的变量设置为None,关闭所有文件和数字等等.在该块之后,我使用subprocess.call()来运行下一阶段所需的fortran程序.处理.在fortran程序运行时查看顶部显示fortran程序正在使用~100%的cpu和~5%的内存,而python正在使用0%的cpu和53%的内存.然而,我的一小段代码告诉我python中的所有变量加起来只有23Mb,应该是~0.5%.
那么发生了什么?我不希望那个小片段能给我一个关于内存使用情况的信息,但它应该准确到几Mb内吗?或者只是顶部没有注意到内存已经被放弃,但是如果有必要,它可以用于需要它的其他程序吗?
根据要求,这里是用尽所有内存的代码的简化部分(file_name.cub是一个ISIS3立方体,它是一个包含相同地图的5层(波段)的文件,第一层是光谱辐射,下一层4与纬度,经度和其他细节有关.这是我想要处理的火星图像.StartByte是我之前从.cub文件的ascii标题中读取的值,告诉我数据的起始字节,样本和Lines是地图的尺寸,也从标题中读取.):
latitude_array = 'cheese' # It'll make sense in a moment
f_to = open('To_file.dat','w')
f_rad = open('file_name.cub', 'rb')
f_rad.seek(0)
header=struct.unpack('%dc' % (StartByte-1), f_rad.read(StartByte-1))
header = None …Run Code Online (Sandbox Code Playgroud) 我正在使用numpy创建一个边长为100的立方体数组,因此总共包含100万个条目.对于每百万个条目,我插入一个100x100矩阵,其条目由随机生成的数字组成.我使用以下代码来执行此操作:
import random
from numpy import *
cube = arange(1000000).reshape(100,100,100)
for element in cube.flat:
matrix = arange(10000).reshape(100,100)
for entry in matrix.flat:
entry = random.random()*100
element = matrix
Run Code Online (Sandbox Code Playgroud)
我期待这需要一段时间,但是生成了100亿个随机数,我不确定我的电脑是否可以处理它.这样一个阵列会占用多少内存?RAM是一个限制因素,即如果我的计算机没有足够的RAM,它是否无法实际生成阵列?
此外,如果有更高效的实现此代码,我会很感激提示:)
有没有len(someObj)不调用someObj __len__函数的情况?
我最近用(成功的)努力将前者替换为后者以加速某些代码.我想确保在某些地方len(someObj)与someObj不同的边缘情况.__len__().