2017-03-20 11 views
2

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 회 복용하지 않는을 같은 setDataAsyncsetDataAsync 취할 때 (10 열로 1M 행 약 2백10초)에 대한 물론 70 초가 소요되지만 요청시 1.1GB의 메모리가 소모됩니다.

나는 또한 table.rows.add(null, values);을 시도했지만 그 성능은 더욱 떨어졌습니다.

setdataAsync (바로 다음 호출)없이 같은 코드를 테스트했는데 메모리 누수가 발생하지 않았습니다.

다른 사람이 경험 했습니까? 어쨌든 그 메모리를 해제 할 수 있습니까? 빠른 세 가지 방법을 제외하고 Excel에서 많은 양의 데이터를 채울 다른 방법이 있습니까?

답변

0

바인딩을 추가하면 메모리 사용량이 늘어나지 만 setDataAsync을 호출하면 안됩니다 (적어도 수동으로 데이터를 시트에 직접 복사하는 것보다 더 많이 기대할 수는 없습니다) .

가 나는 또한 table.rows.add(null, values)을 시도하지만 더 악화 성능 : 당신이 말할 때 :

것은 명확합니다.

Excel.run(function(context) { ... });을 사용하여 대체 Office 2016-wave-of-API 구문을 사용한다고 가정합니다. 내가 perf에 관한 후속 조치를 취할 수 있지만 새로운 API 구문을 사용할 때 메모리 누수가 발생하면 궁금합니다.

FWIW에는 성능을 높여야하는 값을 설정하면서 계산을 일시 중지 할 수있는 API가 곧 출시 될 예정입니다. 하지만 우리가 지적하고있는 두 가지 문제, 즉 메모리 누수가 setDataAsyncrange.values 인 것을 알아낼 수 있는지 알고 싶습니다.

위의 질문에 대답하여 시작할 수있는 경우 (동일한 누설이 range.values에도 발생하는지 여부) 문제를 협의하는 데 도움이되며 팀에 후속 조치를 취할 것입니다.

감사합니다!

+0

'range.values' ('Excel.run' 내부)는 메모리 누수가 없지만 setDataAsync보다 훨씬 느립니다 (3 배 느린). 또한 각'setDataAsync' 후에'releaseByIdAsync'를 호출 해 보았지만 여전히 메모리는 해제되지 않았습니다. –

+0

정보를 제공해 주셔서 감사합니다. 조사를 위해 팀에 전달하겠습니다. –

+0

고맙습니다. 새로운 API에 ETA가 설정 값이 향상 되었습니까? –

0

window.Excel._RedirectV1APIs이라는 부울이 있는데 true으로 설정하면 setDataAsync에서 새 API를 사용합니다.그것은 자동으로 설정해야하는 경우

window.Office.context.requirements.isSetSupported("RedirectV1Api")

반환 사실이지만 어떻게 든 그 요구 사항이 설정되어 있지만 수동

window.Excel._RedirectV1APIs = true

를 설정하면 작동하지만 여전히 setDataAsync 네이티브보다 훨씬 느린 것이 아니라, range.values 수동 접근 (160s 대 180m, 1M 행 × 10cols)보다 약간 빠르며 메모리 누수가 발생하지 않습니다.

id : 71 (setDataAsnyc) 함수와 콜백 함수를 호출하여 메모리 누수가 발생하는 것으로 나타났습니다. 메모리 누수가 발생하는 것처럼 보입니다. Excel 자체의 외부 코드 때문입니다. 메모리 누출은 인터넷 익스플로러 프로세스에 있지만). 회로를 단락시키고 window.external.Execute 대신 직접 콜백을 호출하면 메모리 누수가 발생하지 않지만 물론 데이터가 설정되지 않습니다.