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 ...
随机推荐
- day 03作业
目录 作业 简述执行Python程序的两种方式以及他们的优缺点: 简述Python垃圾回收机制: 对于下述代码: 10的引用计数为多少? x对应的变量值257的引用计数为多少? 简述Python小整数 ...
- HDU1213通畅工程-并查集求解
并查集的经典题目. 并查集.经典题目是HDU1232通畅工程. 题目描述: 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府"畅通工程"的目标 ...
- Spring @Cacheable注解 && 事务@Transactional 在同一个类中的方法调用不生效
@Cacheable 注解在对象内部调用不会生效 代码示例:ProductServiceImpl.java public List<ProductInfoVO> getProductLis ...
- docker 安装 oracle
docker 安装 oracle 部署链接:https://www.linuxidc.com/Linux/2017-03/141760.htm 本次使用docker安装oracle 1.搜索可使用的镜 ...
- Python_soket
1.socket建立连接,服务端,客户端代码如下: import socket #服务端,AF_INET:IPV4地址,SOCK_STREAM:TCP协议 sk=socket.socket(socke ...
- 阿里云云计算助理工程师认证(ACA)
经过两天的学习(观看视频,阅读官方帮助文档),完成了初级云计算认证. 本次考试难度相对较低,考察内容较为初级 考点主要考察学员是否真正的动手实验过,不局限于视频中讲解的内容,较多的考点为视频中操作演示 ...
- django项目基于钩子验证的注册功能
前端html <div class="agile-row"> <h3>注册</h3> {# 注册的开始#} <div class=&quo ...
- Java7与Java8中的HashMap和ConcurrentHashMap知识点总结
JAVA7 Java7的ConcurrentHashMap里有多把锁,每一把锁用于其中一部分数据,那么当多线程访问容器里不同数据段的数据时,线程间就不会存在锁竞争,从而可以有效的提高并发访问效率呢.这 ...
- C# 退出应用程序的几种方法
Application.Exit();//好像只在主线程可以起作用,而且当有线程,或是阻塞方法的情况下,很容易失灵 this.Close();//只是关闭当前窗体. Application.ExitT ...
- 初学Django基础02 ORM操作
django的ORM操作 之前我们知道了models.py这个文件,这个文件是用来读取数据结构的文件,每次操作数据时都走这个模块 常用字段 AutoField int自增列,必须填入参数 primar ...