如果你是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.wasmaddrow.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使用量的计算的更多相关文章

  1. --关于null在oracle数据库中是否参与计算,进行验证,

    --关于null在oracle数据库中是否参与计算,进行验证,with td as (select null id,1 name from dual ),td1 as ( select null id ...

  2. [TcaplusDB知识库]数据库支撑底盘引擎计算层介绍

    在上次的TcaplusDB知识库中,TcaplusDB君为大家讲解了TcaplusDB所用的基于HASH表的Key-value存储引擎TXHDB.存储引擎作为数据库的支撑底盘,其重要性无可置疑,而在本 ...

  3. Zabbix数据库空间大小使用计算

    一.Zabbix的数据存储主要分类 1.历史数据 2.趋势数据 3.事件数据 二.每秒处理的数据量 顾名思义,例如,有3000个监控项(item),每60秒取一次值,即平均每秒有50(3000/60) ...

  4. ORACLE 数据库使用正则表达式重新计算指定位置的数字为新的数字

    昨天工作中遇到这个问题: 有一个这样的字符串expression变量,里面可能存储的值类似于以下[Index_CivilWork,0]*(1+[Y10814,1])/[Y10674,1] [300,1 ...

  5. 区块链3.0:拥抱EOS

    EOS是当下最火的区块链技术,被社会广泛看好为下一代区块链3.0.不同于以太坊的学习,EOS的主语言是C++,本文作为EOS研究的首篇文章,重点介绍EOS的创新点,它的周边生态,各种概念原理的解释,以 ...

  6. EOS区块同步源码分析之见证者

    调了两天,终于把EOS的出块和DPOS共识机制的代码看了个大概,下面做个小总结.因为这一块是EOS比较核心的代码块,稍微复杂些,如果有理解错误之处,请大家见识并帮我指出来,我也会有可能随时改写这里的内 ...

  7. 深度 | 带领国产数据库走向世界,POLARDB底层逻辑是什么?

    POLARDB 是阿里云自主研发的下一代云原生分布式数据库,100%兼容MySQL.PostgreSQL等开源数据库,高度兼容Oracle语法,使用RDS服务的客户不需要修改应用代码,可以一键迁移到P ...

  8. 30多条mysql数据库优化方法,千万级数据库记录查询轻松解决(转载)

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...

  9. Sql Server数据库备份和恢复:原理篇

    本文与您探讨为什么Sql Server有完整备份.差异备份和事务日志备份三种备份方式,以及为什么数据库又有简单模式.完整模式和大容量日志模式这三种恢复模式.本文内容适用于2005以上所有版本的Sql ...

随机推荐

  1. windows下控制台程序实现窗口显示

    windows下实现窗口显示,如果限定是C/C++语言,并且是原生Windows支持,需要使用GDI或GDI+.一般是在Visual Studio里新建Win32应用程序,而不是Win32 conso ...

  2. 线程中的join方法,与synchronized和wait()和notify()的关系

    什么时候要用join()方法? 1,join方法是Thread类中的方法,主线程执行完start()方法,线程就进入就绪状态,虚拟机最终会执行run方法进入运行状态.此时.主线程跳出start方法往下 ...

  3. centos安装zookeeper,并集群配置

    所有机器操作都一样! 注:zookeeper配置集群时 需把防火墙关掉 或者暴露配置文件里配置的端口, 并且在dataDir目录下要有myid文件 1 下载 wget https://mirrors. ...

  4. Codeforces G. Nick and Array(贪心)

    题目描述: Nick had received an awesome array of integers a=[a1,a2,…,an] as a gift for his 5 birthday fro ...

  5. insmod: ERROR: could not insert module dm-snapshot.ko: Unknown symbol in module

    下面方法成功的前提是你的mod和你的操作系统版本是匹配的,也就是说你的mod之前成功过.说个多余的提示,mod在/lib/modules目录里面 insmod: ERROR: could not in ...

  6. .Net Core 遇到 “'windows-1252' is not a supported encoding name.”

    使用iTextSharp生成Pdf文件时报错如下: 'windows-1252' is not a supported encoding name. For information on defini ...

  7. [TJOI2015]概率论——期望&&母函数

    题意 求一个含有 $n$ 个结点的有序二叉树的叶子节点的期望个数.($n \leq 10^9$) 分析 一堆推导..... 得 $ans = \frac{n(n+1)}{2(2n-1)}$ #incl ...

  8. LOJ P10013 曲线 题解

    每日一题 day38 打卡 Analysis 这道题运用的是三分,就是说具有一定的单调性,找最大最小值,然后和二分基本类似,就是说特性就是说当前两个点比较,较优的点和最优点在相对了较差点的同侧,就是说 ...

  9. 从TEB到PEB再到SEH(二)

    什么是SEH? SEH( Structured Exception Handling , 结构化异常处理 ) 结构化异常处理(SEH)是Windows操作系统提供的强大异常处理功能.而Visual C ...

  10. 使用jmx-exporter&&jmxtrans && nexus jmx 暴露nexus 系统指标信息

    以下演示一个简单的使用jmxexporter 暴露nexus jmx 指标为prometheus metrics,同时也集成了一个简单的jmxtrans 输出数据到 graphite 环境准备 doc ...