因为恒定张量的数据已嵌入到图定义中。这意味着这些数据既存储在维护图定义的客户端中,又存储在运行时中,为所有张量分配其自己的内存。
IE浏览器,尝试
a = tf.constant([1,2])
tf.get_default_graph().as_graph_def()
你会看到的
dtype: DT_INT32
tensor_shape {
dim {
size: 2
}
}
tensor_content: "\001\000\000\000\002\000\000\000"
}
该tensor_content
场是原始内容,一样的np.array([1,2], dtype=np.int32).tobytes()
。
现在,要查看运行时分配,可以使用运行export TF_CPP_MIN_LOG_LEVEL=1
。
如果您使用进行任何评估a
,都会看到类似的内容
2017-02-24 16:13:58: I tensorflow/core/framework/log_memory.cc:35] __LOG_MEMORY__ MemoryLogTensorOutput { step_id: 1 kernel_name: "Const_1/_1" tensor { dtype: DT_INT32 shape { dim { size: 2 } } allocation_description { requested_bytes: 8 allocated_bytes: 256 allocator_name: "cuda_host_bfc" allocation_id: 1 ptr: 8605532160 } } }
这意味着运行时要求分配8个字节,而TF实际上分配了256个字节。(目前实际分配多少数据的选择有些随意-bfc_allocator.cc)
将常量嵌入图形中使进行基于图形的优化(如常量折叠)变得更加容易。但这也意味着大常数是无效的。同样,使用大常量是导致图形大小超过2GB限制的常见原因。
我们的软件正在通过一个从内存流读取数据的GZipStream解压某些字节数据。这些数据以4KB的块解压缩,并写入另一个内存流。 我们已经意识到进程分配的内存远高于实际解压的数据。 示例:具有2425536字节的压缩字节数组被解压缩为23050718字节。我们使用的内存分析器显示了方法MemoryStream。设置容量(Int32值)分配的67104936字节。这是保留内存和实际写入内存之间的2.9
为什么会这样?最后,还有其他类似的功能我应该知道是不允许的。
我认为它们的分配如下: 全局变量-------->数据 静态变量-------->数据 常量数据类型------>代码 局部变量(在函数中声明和定义)---------->堆栈 在main函数中声明和定义的变量------>堆 指针(例如,、)-------->heap 动态分配的空间(使用malloc和calloc)-------->stack 我只是从C的角度提到这些变量。 如果我不对,请指正
初始化数据段 BSS 堆栈 堆 代码 现在考虑以下程序: 在上面的程序中,arr和x都是在main函数内本地声明的。我认为这意味着它们都将在函数堆栈上分配空间。但是,当我在linux上运行size命令时,我发现实际上正在为数组分配数据段中的空间。
问题内容: 在64位系统上,Python中的整数占用24个字节。这是C语言中64位整数所需内存的3倍。现在,我知道这是因为Python整数是对象。但是,额外的内存又有什么用呢?我有我的猜测,但肯定会很高兴。 问题答案: 请记住,Python类型没有C那样有限的范围。唯一的限制是可用内存。 内存用于存储值,整数存储的当前大小(存储大小可变以支持任意大小)以及标准的Python对象簿记(对相关对象的引
问题内容: 引用golangWiki(https://github.com/golang/go/wiki/MethodSets#interfaces): “以相同的方式,存储在接口中的具体值不可寻址,即映射元素不可寻址。” 但是,关于接口尚不清楚。为什么无法寻址?这是因为某些硬性设计假设吗? 问题答案: 为什么非指针值不能存储在可寻址的接口中?这是一个很好的问题,答案解释了为什么包含非指针值的