Excel 2016에서 사무실 js의 공유 API에서 비동기 함수를 사용하면 메모리 누수가 발생합니다. 특히 작성된 데이터를 절대로 출력하지 않는 binding.setDataAsnyc
을 호출합니다. (누출은 Internet Explorer 엑셀에서 addin을 실행하는 프로세스 (32 비트 버전 임)).Office JS setDataAsync 함수 메모리 누수
예 :
//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);
I는 각각 setDataAsync
후 결합 여전히 메모리가 계속 해제 시도. 메모리를 되 찾는 유일한 방법은 addin을 다시로드하는 것입니다.
range.values = values;
이 누출되지만, 최대 3 회 복용하지 않는을 같은 setDataAsync
setDataAsync
취할 때 (10 열로 1M 행 약 2백10초)에 대한 물론 70 초가 소요되지만 요청시 1.1GB의 메모리가 소모됩니다.
나는 또한 table.rows.add(null, values);
을 시도했지만 그 성능은 더욱 떨어졌습니다.
setdataAsync
(바로 다음 호출)없이 같은 코드를 테스트했는데 메모리 누수가 발생하지 않았습니다.
다른 사람이 경험 했습니까? 어쨌든 그 메모리를 해제 할 수 있습니까? 빠른 세 가지 방법을 제외하고 Excel에서 많은 양의 데이터를 채울 다른 방법이 있습니까?
'range.values' ('Excel.run' 내부)는 메모리 누수가 없지만 setDataAsync보다 훨씬 느립니다 (3 배 느린). 또한 각'setDataAsync' 후에'releaseByIdAsync'를 호출 해 보았지만 여전히 메모리는 해제되지 않았습니다. –
정보를 제공해 주셔서 감사합니다. 조사를 위해 팀에 전달하겠습니다. –
고맙습니다. 새로운 API에 ETA가 설정 값이 향상 되었습니까? –