EOS 数据库RAM使用量的计算
如果你是EOS的合约开发者,相信你很有可能跟我一样对内存(RAM)的使用量感到不解。在使用multi_index进行数据存储时,明明只存了一点数据,但区块链浏览器中显示的内存占用量却上升了不少。在这篇文章中,我们就来对内存用量一探究竟,精确计算出存储数据所需要的RAM。我们会首先编写一个简单的合约,用以向multi_index内存入数据。部署合约后,每次调用接口前后都查询一下RAM用量,并予以记录。
合约编写
新建合约目录:
$ mkdir addrow
$ cd addrow
$ touch addrow.cpp
这里是一份简单的合约,用户每次调用add时,数据库中都会多存一行记录
#include <eosiolib/eosio.hpp> class [[eosio::contract]] addrow : public eosio::contract
{
public:
addrow( eosio::name receiver, eosio::name code, eosio::datastream<const char*> ds )
: eosio::contract(receiver, code, ds), _students(receiver, code.value)
{} //添加学生
[[eosio::action]]
void add(eosio::name user)
{
require_auth(user);
eosio::print("Add student ", user);
_students.emplace(get_self(), [&](auto& p) {
p.id = _students.available_primary_key();
});
} struct [[eosio::table]] students
{
uint64_t id; // primary key uint64_t primary_key() const { return id; }
}; //数据表根据age排序
typedef eosio::multi_index<"students"_n, students > studentstable; //students数据库表
studentstable _students;
}; EOSIO_DISPATCH( addrow, (add) )
使用eosiocpp工具进行编译后,得到addrow.wasm与addrow.abi文件:
$ eosiocpp -o addrow.wast addrow.cpp
$ eosiocpp -g addrow.abi addrow.cpp
部署合约
cleos -u https://jungle2.cryptolions.io:443 set contract zmcheng12345 /root/github.com/addrow -p zmcheng12345@active
查账户内存使用情况:
cleos -u https://jungle2.cryptolions.io:443 get account zmcheng12345 -j
我查询到的数值为:
"ram_usage": 52665
这个数值可能根据你的编译工具和参数不同而有所变化。我们以查询到的数值为基础,进行后续的差值计算。
调用合约,新增一行数据:
$ cleos push action eosio.ramfee add '' -p eosio.ramfee
查询用量,得到的结果是:
"ram_usage": 52897
再新增一行并查询,这次的结果是:
"ram_usage": 53017
通过计算可以得出,新增第一行的内存占用量达到了232字节!而第二行的占用量也高达120字节!如果继续新增行数,你会发现后续的行占用量均为120字节。
也就是说,存储一个仅有一个uint64_t字段(大小为8字节)的数据表,首行占用232字节,后续行数占用120字节。
总结
在EOS合约内使用multi_index存储数据(不使用secondary index的情况下),需要承担以下RAM使用量:
- 首先,每新增一行记录,都会占用112字节+实际数据大小
 - 如果这个数据表本身不存在,需要再额外收取112字节的RAM占用
 
可以看到,每行数据的overhead(112字节)还是相当大的。如果单纯地使用数据结构大小来计算,预期使用量与实际使用量的误差会非常大(本例中,首次存储8字节数据的实际用量是数据大小的29倍!)。而得知了精确的占用量算法之后,就可以更好地规划dApp所需要的内存量了。
 
EOS 数据库RAM使用量的计算的更多相关文章
- --关于null在oracle数据库中是否参与计算,进行验证,
		
--关于null在oracle数据库中是否参与计算,进行验证,with td as (select null id,1 name from dual ),td1 as ( select null id ...
 - [TcaplusDB知识库]数据库支撑底盘引擎计算层介绍
		
在上次的TcaplusDB知识库中,TcaplusDB君为大家讲解了TcaplusDB所用的基于HASH表的Key-value存储引擎TXHDB.存储引擎作为数据库的支撑底盘,其重要性无可置疑,而在本 ...
 - Zabbix数据库空间大小使用计算
		
一.Zabbix的数据存储主要分类 1.历史数据 2.趋势数据 3.事件数据 二.每秒处理的数据量 顾名思义,例如,有3000个监控项(item),每60秒取一次值,即平均每秒有50(3000/60) ...
 - ORACLE 数据库使用正则表达式重新计算指定位置的数字为新的数字
		
昨天工作中遇到这个问题: 有一个这样的字符串expression变量,里面可能存储的值类似于以下[Index_CivilWork,0]*(1+[Y10814,1])/[Y10674,1] [300,1 ...
 - 区块链3.0:拥抱EOS
		
EOS是当下最火的区块链技术,被社会广泛看好为下一代区块链3.0.不同于以太坊的学习,EOS的主语言是C++,本文作为EOS研究的首篇文章,重点介绍EOS的创新点,它的周边生态,各种概念原理的解释,以 ...
 - EOS区块同步源码分析之见证者
		
调了两天,终于把EOS的出块和DPOS共识机制的代码看了个大概,下面做个小总结.因为这一块是EOS比较核心的代码块,稍微复杂些,如果有理解错误之处,请大家见识并帮我指出来,我也会有可能随时改写这里的内 ...
 - 深度 | 带领国产数据库走向世界,POLARDB底层逻辑是什么?
		
POLARDB 是阿里云自主研发的下一代云原生分布式数据库,100%兼容MySQL.PostgreSQL等开源数据库,高度兼容Oracle语法,使用RDS服务的客户不需要修改应用代码,可以一键迁移到P ...
 - 30多条mysql数据库优化方法,千万级数据库记录查询轻松解决(转载)
		
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...
 - Sql Server数据库备份和恢复:原理篇
		
本文与您探讨为什么Sql Server有完整备份.差异备份和事务日志备份三种备份方式,以及为什么数据库又有简单模式.完整模式和大容量日志模式这三种恢复模式.本文内容适用于2005以上所有版本的Sql ...
 
随机推荐
- Python学习日记(二十六) 封装和几个装饰器函数
			
封装 广义上的封装,它其实是一种面向对象的思想,它能够保护代码;狭义上的封装是面向对象三大特性之一,能把属性和方法都藏起来不让人看见 私有属性 私有属性表示方式即在一个属性名前加上两个双下划线 cla ...
 - Ubuntu安装Java环境经历
			
1.权限不够 sudo su gedit /etc/sudoers 添加 用户名 ALL=(ALL:ALL) ALL 2.配置java 放到 /usr/lib/jvm/下 sudo gedit /et ...
 - 构建nodejs环境
			
总想留下点东西,不负年华! 00.download releasehttps://nodejs.org/dist/ //all release example https://nodejs. ...
 - MySQL/MariaDB数据库的查询缓存优化
			
MySQL/MariaDB数据库的查询缓存优化 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.MySQL架构 Connectors(MySQL对外提供的交互接口,API): ...
 - 面试必备技能:HashMap哪些技术点会被经常问到?
			
1.为什么用数组+链表? 数组是用来确定桶的位置,利用元素的key的hash值对数组长度取模得到. 链表是用来解决hash冲突问题,当出现hash值一样的情形,就在数组上的对应位置形成一条链表.ps: ...
 - jquery 子元素筛选选择器
			
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-type" content ...
 - HDU-4544 湫湫系列故事——消灭兔子 (贪心+优先队列)
			
题目思路 将兔子的血量从大到小排列,将箭的属性写在类中(结构体也成),排序按照伤害从大到小排列,若有相等的则按价格从小到大排. 代码 #include<bits/stdc++.h> usi ...
 - Supermarket(贪心/并查集)
			
题目链接 原创的博客 题意: 超市里有N个商品. 第i个商品必须在保质期(第di天)之前卖掉, 若卖掉可让超市获得pi的利润. 每天只能卖一个商品. 现在你要让超市获得最大的利润. n , p[i], ...
 - 【原创】selenium+python+openpyxl实现登录自动化测试,自动读取excel用例数据,并将数据结果自动写入到excel
			
# -*- coding: utf-8 -*- from selenium import webdriver from openpyxl import load_workbook from time ...
 - VMware下安装的CentOS7.5,设置成静态IP后ping不通外网
			
网上很多都说用下面的方法即可解决 在CentOS中 ping www.baidu.com 无法ping通,可能原因是DNS没配置好 方法一: 修改vim /etc/resolv.conf 增加如下内容 ...