GoogleScript 将 JDBC ResultSet 加载到数组中非常慢/如何优化?

问题描述 投票:0回答:3

我在 GoogleScript 上使用 JDBC 与 GoogleCloud MySQL 进行通信。

我的表有 24 列,将 1000 行 ResultSet 加载到数组中大约需要 30 秒。下面代码块中的循环占用了大部分时间。

我是否犯了任何错误导致它这么慢?有没有办法优化这个?有更好的方法吗?

var results = stmt.executeQuery(query);

  results.last();
  var nrow = results.getRow()
  results.first();
  var ncol = results.getMetaData().getColumnCount();

  var dat = new Array(nrow);
  for (var i = 0; i<nrow; i++){
    dat[i]=new Array(ncol);
    for(var j = 0; j<ncol; j++){
      dat[i][j] = results.getString(j+1);
    }
    results.next();
  }
performance loops google-apps-script optimization jdbc
3个回答
10
投票

遇到了同样的问题,并意识到这是由新的 V8 运行时迁移引起的。我又回到了旧的,它起作用了,速度变得更快了。我真的不知道为什么它在新版本中不能很好地工作......它应该更好=/

无论如何,您可以在菜单中更改回旧的Rhino版本运行>禁用由V8支持的新Apps脚本。

希望这有帮助。祝你好运!


0
投票

我也发现自己有这个问题。也许它已经为您解决了,但无论如何,对于任何具有相同问题的潜在未来用户,我想我会分享我的发现。

与 google 支持团队合作,无法对 JDBC 连接进行实质性改进。建立连接需要 2-4 秒,而且 google apps 脚本根本不允许使用任何有效的方法将 JDBC 结果存储到数组中。根据 Google 支持团队的说法,这似乎只是一个固有的限制。

就我而言,与其他一些海报/读者不同,切换回 Rhino 实际上并没有太大影响。

我最终改用谷歌表格作为数据库,通过比较,它平均约为 1.00 秒。以前,这需要 30-120 秒。我的数据集大约有 2000 行,大约 8 列,主要是文本,大小约为 90-100KB。


0
投票

这个答案很疯狂,但它可以将运行时间减少多达 50% 甚至更多。再加上旧的 Rhino 版本,我发现获取的列越多,迭代过程就越慢;您可以迭代最多 2-3 列,然后对其余列进行另一次迭代,这意味着:

    var results = stmt.executeQuery(query);
    var results1=results // used to reset 2nd iterator
    var results2=results // used to reset 3rd iterator
    var results3=results // used to reset 4th iterator
    const numCols = results.getMetaData().getColumnCount();
    var arr=[];
    while (results.next()) {
      var rowString=[];
      for(var col = 0; col < 3; col++){
        rowString.push(results.getString(col + 1))
      };
      arr.push(rowString);
    };

    var i=0
    while (results1.next()) {
      for(col = 3; col < 6; col++){
        arr[i].push(results1.getString(col + 1))
      };
      i++
    };
    var i=0
     while (results2.next()) {
      for(col = 6; col < 9; col++){
        arr[i].push(results2.getString(col + 1))
      };
      i++
    };
    var i=0
     while (results3.next()) {
      for(col = 9; col < numCols; col++){
        arr[i].push(results3.getString(col + 1))
      };
      i++
    }; 

所用时间:1943 行和 13 列 // 使用 V8 运行时为 8670 毫秒;

经过的时间:1943 行和 13 列为 2004 毫秒 // 没有 V8 运行时;

© www.soinside.com 2019 - 2024. All rights reserved.