2013-03-18 103 views
0

我正在尝试估计当前GAS项目的限制。我使用ScriptDB来处理大约6分钟的执行限制。如果我有一个对象,如ScriptDB对象大小计算

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限制之前预测同时存在多少这些对象。

回答

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; 
} 
+0

感谢您的详细解答。这工作得很好。 – Greg 2013-03-19 14:36:38