Excel Office JS setDataAsync函数内存泄漏

Excel Office JS setDataAsync函数内存泄漏,excel,memory-leaks,ms-office,office-js,office-addins,Excel,Memory Leaks,Ms Office,Office Js,Office Addins,在Excel 2016中office js的共享API中使用异步函数时,会导致内存泄漏,特别是调用binding.setDataAsnyc,该函数从不释放写入的数据。(泄漏发生在运行Excel内加载项的internet explorer进程中(它是32位版本)) 例如: //1 Miliion row by 10 columns data parsed from a csv usually in chunks var data = []; var i,j; for (i=0; i<1000

在Excel 2016中office js的共享API中使用异步函数时,会导致内存泄漏,特别是调用
binding.setDataAsnyc
,该函数从不释放写入的数据。(泄漏发生在运行Excel内加载项的internet explorer进程中(它是32位版本)

例如:

//1 Miliion row by 10 columns data parsed from a csv usually in chunks
var data = [];
var i,j;
for (i=0; i<1000000; i++) {
    row = [];
    for(j=0; j<10; j++) {
        row.push("data" + i + "" + j);
    }
    data.push(row);
}
var limit = 10000;
var next = function (step) {
    var columnLetter = getExcelColumnName(data[0].length);
    var startRow = step * limit + 1;
    var endRow = start + limit;
    if (data.length < startRow)
        return;
    var values = data.slice(startRow - 1, endRow - 1);
    var range = "A" + startRow + ":" + columnLetter + "" + endRow;
    Office.context.document.bindings.addFromNamedItemAsync(range,
        Office.CoercionType.Matrix, { id: "binding" + step },
        function (asyncResult) {
            if (asyncResult.status == "failed") {
                console.log('Error: ' + asyncResult.error.message);
                return;
            }

            Office.select("bindings#binding" + step).setDataAsync(values,
                {
                    coercionType: Office.CoercionType.Matrix
                }, function (asyncResult) {
                    //Memory keeps Increasing on this callback
                    if (asyncResult.status == Office.AsyncResultStatus.Failed) {
                        console.log("Action failed with error: " + asyncResult.error.message);
                        return;
                     }

                     next(step++);
                });
        });
    }

next(0);
它不会泄漏,但需要的时间是
setDataAsync
的3倍(对于1M行x 10列,大约210秒),而
setDataAsync
大约需要70秒,但当然会泄漏,并在该请求中消耗1.1GB内存

我还尝试了
table.rows.add(null,value)但这会带来更糟糕的性能

我在没有
setdataAsync
(立即调用next)的情况下测试了相同的代码,并且没有发生内存泄漏

还有其他人经历过吗? 它周围是否有释放记忆的方法?
如果没有,除了这三种方法之外,还有其他方法可以在Excel中填充大量数据,而且速度也很快吗?

添加绑定确实会增加内存消耗——但仅仅调用
setDataAsync
绝对不应该(或者至少,不应该超出您的预期,也不应该超出手动将数据复制粘贴到工作表的范围)

有一件事需要澄清:当你说:

我还尝试了
table.rows.add(null,values)
,但性能更差

我假设您的意思是使用
Excel.run(函数(上下文){…})执行替代Office 2016的API语法浪潮?我可以继续关注perf,但我很好奇,当您使用新的API语法时,是否也会发生内存泄漏

FWIW,在不久的将来会有一个API,它将允许您在设置值时暂停计算,这将提高性能。但我确实想看看我们是否能解决您指出的两个问题:
setDataAsync
上的内存泄漏和
range.values
调用

如果您可以从回答上述问题开始(即使在
范围.values
中是否也会发生相同的泄漏),这将有助于缩小问题范围,然后我将与团队跟进


谢谢

我发现有一个布尔
窗口.Excel.\u\u可以将API设置为
true
,使
setDataAsync
使用新的API。如果出现以下情况,则应自动设置:

window.Office.context.requirements.isSetSupported(“RedirectV1Api”)

返回true,但不知何故,该需求未设置,但如果您手动设置,它会起作用

window.Excel.\u=true

但是它仍然比原生的
setDataAsync
慢得多,但比
范围值的手动方法略快(对于1M行乘以10列的情况,是160秒对180秒),并且不会导致内存泄漏


另外,我发现内存泄漏发生在id为71(
setDataAsnyc
)的
window.external.Execute(id,params,callback)
函数之后,并且从该函数调用回调时,因此内存泄漏似乎是在Excel本身的外部代码中发生的(尽管内存泄漏在internet explorer进程中)。如果您短路,直接调用回调,而不是
window.external.Execute
则不会发生内存泄漏,但当然也不会设置任何数据。

否,
range.values
(在
Excel.run中运行
)不会泄漏内存,但如上所述,速度要慢得多(慢3倍)除了setDataAsync。我还尝试在每次
setDataAsync
之后调用
releaseByIdAsync
,但内存始终没有释放。好的,很好,谢谢你提供的信息。让我把它交给团队调查。谢谢,新API上有没有关于设置值改进的预计到达时间?Mahmoudbaha,最早的可能是3个月后(简单的物理——1.5版ExcelAPI刚刚发布,应该在“完成”后2个月内公开发布;因此,由于它不是该系列的一部分,因此它将是此后的事情。因此,尽管我不能保证任何事情,但3-6个月范围内的事情可能是一个不错的猜测)。
range.values = values;