ScriptDB对象大小计算

时间:2013-03-18 19:01:00

标签: google-apps-script

我正在尝试估算当前GAS项目的限制。我使用ScriptDB来处理处理以达到6分钟的执行限制。如果我有像

这样的对象
var userObj{

   id: //user email address
   count: //integer 1-1000
   trigger: //trigger ID
   label: //string ~30 char or less
   folder: //Google Drive folder ID
   sendto: //'true' or 'false'
   shareto: //'true' or 'false'
}

如何计算此对象在数据库中占用的大小?我想预测在我达到域的200MB限制之前,可以同时存在多少这些对象。

1 个答案:

答案 0 :(得分:2)

每当您对google-apps-script提出的问题与API无关时,请先尝试搜索javascript问题。在这种情况下,我找到了JavaScript object size,并在apps-script中尝试了接受的答案。 (实际上,“改进的”接受了答案。)我根本没有做任何改动,但是在这里用测试功能复制了它,所以你可以切换&粘贴试试。

这是我在调试器中使用测试stud对象获得的内容。 screenshot of debugger

现在,它并不完美 - 例如,它不会影响您在ScriptDB中使用的键的大小。 Another answer对此进行了抨击。但是,由于您的对象包含一些潜在的巨大值,例如可能长度为256个字符的电子邮件地址,因此密钥长度可能不太重要。

// https://stackoverflow.com/questions/1248302/javascript-object-size/11900218#11900218
function roughSizeOfObject( object ) {

    var objectList = [];
    var stack = [ object ];
    var bytes = 0;

    while ( stack.length ) {
        var value = stack.pop();

        if ( typeof value === 'boolean' ) {
            bytes += 4;
        }
        else if ( typeof value === 'string' ) {
            bytes += value.length * 2;
        }
        else if ( typeof value === 'number' ) {
            bytes += 8;
        }
        else if
        (
            typeof value === 'object'
            && objectList.indexOf( value ) === -1
        )
        {
            objectList.push( value );

            for( i in value ) {
                stack.push( value[ i ] );
            }
        }
    }
    return bytes;
}


function Marks()
{
  this.maxMarks = 100;
}

function Student()
{
  this.firstName = "firstName";
  this.lastName = "lastName";
  this.marks = new Marks();
}

function test () {
  var stud = new Student();
  var studSize = roughSizeOfObject(stud);
  debugger;
}