대용량 데이터셋을 처리할 때 LibreOffice Calc 매크로 속도를 높이는 방법

LibreOffice Calc 매크로는 큰 워크시트에서 속도가 느려지는 경우가 많은데, 그 이유는 간단합니다. 매크로가 실제 계산을 수행하는 시간보다 UNO 객체 경계를 넘나드는 데 더 많은 시간을 소비하기 때문입니다. 하나의 셀을 읽고, 변경하고, 다시 저장하는 작업을 수천 번 반복하는 것은 동일한 데이터를 더 큰 블록으로 이동하는 것보다 훨씬 더 많은 리소스를 소모합니다.

목표는 모든 매크로를 추상적으로 "빠르게" 만드는 것이 아닙니다. 유용한 최적화는 동일한 결과를 생성하고, 동일한 데이터 세트에서 더 짧은 시간 내에 완료되며, 워크플로에 맞춰 Calc의 응답성을 유지하고, 새로운 정확성 문제나 메모리 문제를 발생시키지 않아야 합니다. 아래의 기법들은 이러한 측정 가능한 결과에 초점을 맞추고 있습니다.

2026년 10월 현재, 최신 LibreOffice SDK 문서에서는 LibreOffice 26.8 API 참조에서 사용되는 스프레드시트 인터페이스를 설명하고 있습니다. 핵심 메서드는 새로 도입된 성능 향상 기능이 아니라 기존의 UNO 인터페이스입니다.

1. 매크로를 변경하기 전에 측정하십시오.

반복 가능한 기준선부터 시작하세요. LibreOffice Basic은 GetSystemTicks()시스템 실행 시간을 측정하고 프로세스를 최적화하는 데 사용할 수 있는 기능을 제공합니다. 공식 도움말에서는 이를 시스템 실행 시간을 측정하고 프로세스를 최적화하는 방법으로 설명합니다. 통합 문서 열기, 사용자 프롬프트 또는 관련 없는 설정 시간 측정 대신 실제로 개선하려는 매크로 부분을 감싸세요.

Dim t0 As Long, elapsed As Long

t0 = GetSystemTicks()

' Run the work you want to measure here.

elapsed = GetSystemTicks() - t0
MsgBox "Elapsed ticks: " & elapsed

동일한 파일 복사본에 대해 동일한 작업을 여러 번 실행하십시오. 첫 번째 실행 결과는 파일 시스템 캐시, 수식 상태 또는 기타 일회성 작업으로 인해 다를 수 있습니다. 데이터 세트 크기, 처리된 범위 및 자동 계산 사용 여부를 기록하여 비교 결과가 의미 있도록 하십시오.

좋은 결과란 단순히 소요 시간 수치가 낮아지는 것만을 의미하지 않습니다. 행 수, 합계, 수식, 텍스트 값, 날짜 및 모든 출력 범위가 기준선과 여전히 일치하는지 확인하십시오.

공식 참조: LibreOffice 도움말: GetSystemTicks 함수 .

2. 먼저 셀 단위 읽기 및 쓰기 작업을 제거합니다.

매크로가 넓은 범위를 순회하며 와 같은 메서드를 반복적으로 호출하는 경우 getCellByPosition(), 일반적으로 해당 패턴을 먼저 살펴보아야 합니다. UNO API는 전체 셀 범위를 배열로 이동하기 위한 XCellRangeData.getDataArray()와 같은 메서드를 제공합니다.setDataArray()

공식 API에 따르면 이 함수는 getDataArray()각 행에 열이 포함된 일련의 행을 반환합니다. 값은 문자열 또는 double형으로 반환됩니다. setDataArray()이 함수는 배열을 지정된 범위에 다시 쓰며, 배열의 크기는 해당 범위와 일치해야 합니다.

예를 들어, A열부터 E열까지 매크로가 변환할 입력값이 있다고 가정해 보겠습니다. 각 셀을 개별적으로 읽는 대신, 정확한 범위를 한 번에 선택하세요.

Dim doc As Object
Dim sheet As Object
Dim sourceRange As Object
Dim data As Variant

doc = ThisComponent
sheet = doc.Sheets.getByName("Data")

' Example only: A2:E50001.
sourceRange = sheet.getCellRangeByPosition(0, 1, 4, 50000)
data = sourceRange.getDataArray()

Basic 메모리에서 처리를 수행한 data다음, 결과 배열을 일치하는 대상 범위에 한 번의 작업으로 기록합니다. 이렇게 하면 수천 번의 개별 읽기 및 쓰기 작업에 비해 UNO 호출 횟수가 크게 줄어듭니다.

공식 참조: LibreOffice SDK: XCellRangeData 및 LibreOffice SDK: XCellRange .

3. 실제로 필요한 범위만 처리하십시오.

대량 배열 접근은 유용하지만, 불필요하게 큰 시트를 배열로 변환하면 메모리 병목 현상이 발생할 수 있습니다. 특정 표만 사용하는 작업의 경우 전체 열이나 Calc 그리드 전체를 하드코딩하는 것은 피해야 합니다.

통합 문서에 이미 있는 정보(가져오기 행 수, 데이터베이스 결과 크기, 지정된 키 열 또는 응용 프로그램에서 생성하는 범위)를 사용하여 마지막으로 의미 있는 행을 확인합니다. 그런 다음 매크로에 필요한 행과 열만 요청합니다.

이는 특히 워크시트에 실제 데이터보다 훨씬 아래쪽에 서식이 포함되어 있거나 기존 콘텐츠로 인해 사용 영역이 넓어 보이는 경우에 중요합니다. 대용량 메모리 배열은 RAM을 많이 사용하므로, 한 번의 과도한 할당이 적당한 크기의 블록을 처리하는 것보다 더 나쁠 수 있습니다.

청킹으로 전환해야 하는 시점

단일 배열 처리 시 메모리 사용량이 급격히 증가하거나, 처리 시작 전 대기 시간이 길어지거나, 시스템의 실질적인 한계에 근접하는 경우 데이터를 블록 단위로 처리하십시오. 예를 들어, 수천 개의 행을 처리하고 결과를 기록한 다음 다음 블록으로 진행하는 방식입니다. 모든 경우에 적합한 이상적인 블록 크기는 없으므로 실제 통합 문서와 하드웨어를 사용하여 테스트해야 합니다.

4. 작업량이 많을 때는 화면 업데이트 알림을 일시 중지하세요.

Calc 문서는 LibreOffice의 XModel인터페이스를 구현합니다. 이 인터페이스의 lockControllers()메서드는 화면 업데이트에 사용되는 일부 컨트롤러 알림을 일시 중단했다가 unlockControllers()다시 시작합니다. 이를 통해 매크로가 많은 변경 작업을 수행할 때 불필요한 시각적 작업을 줄일 수 있습니다.

Dim doc As Object
doc = ThisComponent

doc.lockControllers()

' Perform bulk changes here.

doc.unlockControllers()

공식 API는 컨트롤러 잠금과 잠금 해제가 반드시 쌍을 이루어야 한다고 명시하고 있습니다. 즉, 실제 운영 환경에서 사용하는 매크로는 unlockControllers()처리 실패 시에도 잠금 해제가 완료되도록 오류 처리를 포함해야 합니다. 문서를 잠근 상태로 두는 것은 성능 최적화가 아니라, 잘못된 정리 경로입니다.

공식 참조: LibreOffice SDK: XModel .

5. 실행 시간에서 수식 사용 비중이 클 경우 자동 재계산을 제어합니다.

매크로가 여러 수식에 사용되는 셀을 반복적으로 변경하는 경우, 매크로가 중간 값을 업데이트하는 동안 Calc는 상당한 시간을 들여 다시 계산할 수 있습니다. 스프레드시트 문서에는 , , , 및 을 XCalculatable포함한 인터페이스가 표시됩니다 .isAutomaticCalculationEnabled()enableAutomaticCalculation()calculate()calculateAll()

더 안전한 방법은 사용자의 현재 계산 모드를 기억하고, 업데이트 중에만 자동 계산을 비활성화한 다음 업데이트 후 원래 상태로 복원하는 것입니다.

Dim doc As Object
Dim wasAutoCalc As Boolean

doc = ThisComponent
wasAutoCalc = doc.isAutomaticCalculationEnabled()

doc.enableAutomaticCalculation(False)

' Perform bulk updates.

doc.enableAutomaticCalculation(wasAutoCalc)

If wasAutoCalc Then
    doc.calculate()
End If

calculate()변경된 셀을 다시 계산합니다. calculateAll()모든 셀을 다시 계산하는데, 이 작업 자체도 비용이 많이 들 수 있으므로 매크로 실행이 완료되었다는 이유만으로 자동으로 호출하지 마십시오. 통합 문서의 논리에 따라 실제로 필요한 경우에만 전체 셀 재계산을 사용하십시오.

컨트롤러 잠금과 마찬가지로 오류 정리 경로에서 계산 상태를 복원해야 합니다. 매크로는 사용자의 통합 문서를 수동 계산 모드로 그대로 둔 채로 종료해서는 안 됩니다.

공식 참조: LibreOffice SDK: XCalculateable .

6. 최적화 결과를 안전하게 결합하세요

일반적으로 가장 효과적인 구조는 다음과 같습니다. 정확한 범위를 결정하고, 한 번만 읽고, 메모리에서 값을 처리하고, 결과를 일괄적으로 기록하고, 해당 작업이 진행되는 동안에만 불필요한 UI 표시나 재계산 작업을 억제합니다.

LibreOffice Basic에서 실용적인 정리 패턴은 다음과 같습니다.

Sub ProcessLargeData
    Dim doc As Object
    Dim sheet As Object
    Dim dataRange As Object
    Dim data As Variant
    Dim wasAutoCalc As Boolean

    On Error GoTo CleanUp

    doc = ThisComponent
    sheet = doc.Sheets.getByName("Data")
    dataRange = sheet.getCellRangeByPosition(0, 1, 4, 50000)

    wasAutoCalc = doc.isAutomaticCalculationEnabled()

    doc.lockControllers()
    doc.enableAutomaticCalculation(False)

    data = dataRange.getDataArray()

    ' Transform data in memory here.
    ' Build an output array with dimensions matching its target range.

CleanUp:
    doc.enableAutomaticCalculation(wasAutoCalc)

    If doc.hasControllersLocked() Then
        doc.unlockControllers()
    End If

    If wasAutoCalc Then
        doc.calculate()
    End If
End Sub

이 예제에서는 변환 로직을 의도적으로 명시하지 않았는데, 그 이유는 해당 부분이 사용자의 통합 문서에 따라 달라지기 때문입니다. 중요한 최적화는 워크플로의 구조이지, 임의로 만든 비즈니스 계산식이 아닙니다.

7. Calc의 내장 함수를 재구현하기 전에 먼저 해당 함수들을 고려하십시오.

LibreOffice Basic은 서비스를 통해 Calc 함수를 호출할 수 있습니다 com.sun.star.sheet.FunctionAccess. 매크로에서 Calc에서 이미 제공하는 조회, 집계 또는 기타 연산을 수동으로 구현하는 경우, 내장 함수를 사용하면 코드를 간소화하고 사용자 지정 반복 작업을 줄일 수 있습니다.

모든 내장 함수가 모든 사용자 지정 알고리즘보다 성능이 뛰어나다는 보장은 없습니다. 실제 작업 부하를 기준으로 성능을 측정하십시오. 공식 도움말에는 Basic에서 Calc 함수를 호출하는 방법이 나와 있으며 함수 이름은 영어로 제공된다는 점이 명시되어 있습니다.

공식 참조: LibreOffice 도움말: 매크로에서 Calc 함수 사용 .

최적화가 충분히 잘 되었는지 어떻게 판단할까요?

확인하다좋은 징조접근 방식을 언제 바꿔야 할까요?
실행 시간반복 측정 결과는 기준 측정 결과보다 일관되게 짧습니다.대부분의 시간은 여전히 ​​한 영역에서 소비되므로 해당 영역을 별도로 프로파일링해야 합니다.
단정합계, 행 수, 수식 및 대표 레코드가 원래 매크로와 일치합니다.배열 변환은 데이터 유형이나 출력 크기를 변경합니다.
메모리대용량 제품군은 교체나 장기간의 할당 중단 없이 원활하게 작동합니다.전체 범위 배열이 너무 커지면 더 작은 청크를 사용하십시오.
재계산수식 작업은 매 쓰기 작업 후가 아니라 주요 업데이트 후에 한 번만 수행됩니다.수식에 따른 종속성에는 중간 계산값이 필요합니다.
UI 동작문서는 완료 또는 실패 후 정상적인 표시 및 계산 상태로 돌아갑니다.상태가 변경된 상태로 유지될 수 있다면, 더 강력한 정리/오류 처리를 추가하세요.

이점을 무효화하는 흔한 실수

  • 필요한 열이 몇 개밖에 없는데도 워크시트 전체를 메모리에 불러오는 경우.
  • 사용은 getDataArray()하지만 모든 결과를 셀별로 다시 쓰는 방식입니다.
  • 자동 계산 기능을 비활성화하고 이전 설정을 복원하는 것을 잊어버린 경우.
  • 신뢰할 수 있는 정리 경로 없이 컨트롤러를 잠급니다.
  • calculateAll()소량 배치 처리 후 매번 호출하며 , 오염된 셀만 재계산이 필요한 경우에도 마찬가지입니다.
  • 동일한 데이터를 반복 측정하는 대신 한 번의 주행으로 속도를 판단하는 것.
  • 출력값이 동일하게 유지되는지 확인하지 않고 성능을 최적화합니다.

이러한 기법들이 더 이상 도움이 되지 않는 지점

배열 전송은 주로 스프레드시트 객체 접근 오버헤드를 줄여줍니다. 하지만 본질적으로 비용이 많이 드는 알고리즘 자체를 해결해 주지는 않습니다. 예를 들어, 모든 행을 다른 모든 행과 중첩 비교하는 알고리즘은 모든 값이 메모리에 저장되어 있더라도 여전히 느릴 수 있습니다. 이런 경우에는 알고리즘을 변경해야 합니다. 딕셔너리나 인덱스를 사용하거나, 반복적인 정렬 대신 한 번의 정렬만 수행하거나, 중복 작업을 줄이거나, 스프레드시트가 더 이상 적합한 실행 환경이 아닌 경우 더 적합한 데이터 처리 도구로 작업을 옮기는 등의 방법을 고려해 볼 수 있습니다.

네트워크 호출, 데이터베이스 쿼리, 파일 I/O 또는 외부 서비스에 의해 성능이 좌우되는 매크로에도 동일하게 적용됩니다. 먼저 성능을 측정하여 눈에 보이는 스프레드시트 루프가 아닌 실제 병목 현상을 최적화하십시오.

권장 최적화 순서

  1. 반복 가능한 데이터 세트를 사용하여 현재 매크로를 측정합니다.
  2. 반복적인 셀 읽기 및 쓰기 작업을 범위 배열로 대체하십시오.
  3. 필요한 행과 열만 정확하게 처리하도록 제한합니다.
  4. 대용량 배열이 메모리 사용에 부담이 될 정도로 크다면 청킹을 사용하십시오.
  5. 대량 생산 시 컨트롤러를 잠그고, 확실한 청소를 보장합니다.
  6. 수식 재계산이 반복되면서 병목 현상이 발생하는 경우 자동 계산을 일시적으로 중단합니다.
  7. 필요한 만큼만 재계산하고, 애플리케이션 상태를 복원한 후, 출력을 검증합니다.
  8. 다시 측정합니다. 실행 시간이 여전히 UNO 접근보다는 계산에 의해 좌우된다면, 알고리즘을 개선하십시오.

대규모 Calc 데이터 세트의 경우, Basic과 스프레드시트 개체 간의 호출 횟수를 줄이는 것이 일반적으로 가장 중요한 구조적 개선 사항입니다. 모든 추가 최적화는 형식적인 절차가 아니라 측정 가능한 결과로 간주해야 합니다. 매크로 속도가 빨라진다고 해서 반드시 유용하지 않은 것은 아니며, 정확성, 예측 가능성, 유지 관리 용이성 또한 유지되어야 합니다.

댓글 남기기

Microsoft Word에서 그림을 이동하는 방법

Microsoft Word에서 그림을 이동하는 방법

워드에서 그림을 드래그하여 이동하는 방법, 텍스트 줄 바꿈을 선택하는 방법, 단락에 그림을 함께 배치하거나 페이지에 고정하는 방법, 그리고 이동하지 않는 이미지를 해결하는 방법을 알아보세요.

엑셀에 체크박스를 삽입하는 두 가지 간편한 방법

엑셀에 체크박스를 삽입하는 두 가지 간편한 방법

셀 내 도구를 사용하여 Excel에 확인란을 삽입하는 방법, 수식을 사용하여 선택된 항목 수를 계산하는 방법, 또는 이전 데스크톱 버전에서 연결된 폼 컨트롤을 추가하는 방법을 알아보세요.

엑셀에서 알파벳 자동 완성하는 방법: A부터 Z까지, 그리고 그 이상

엑셀에서 알파벳 자동 완성하는 방법: A부터 Z까지, 그리고 그 이상

Excel에서 채우기 핸들 함수, SEQUENCE 함수 또는 재사용 가능한 사용자 지정 목록을 사용하여 A부터 Z까지의 소문자 또는 Z를 초과하는 레이블을 생성할 수 있습니다.

엑셀에서 취소선을 긋는 방법: 단축키 및 단계별 방법

엑셀에서 취소선을 긋는 방법: 단축키 및 단계별 방법

Windows, Mac 및 웹에서 Excel을 사용하여 셀에 취소선을 긋고, 셀의 일부 서식을 지정하고, 값을 삭제하지 않고 줄을 제거하는 방법을 알아보세요.

Microsoft Access란 무엇인가요? Microsoft Access의 데이터베이스 도구는 어떻게 작동하나요?

Microsoft Access란 무엇인가요? Microsoft Access의 데이터베이스 도구는 어떻게 작동하나요?

Microsoft Access는 관련 레코드를 저장하고, 쿼리를 작성하고, 데이터 입력 양식을 만들고, 보고서를 생성하는 데 사용할 수 있는 Windows 데이터베이스 응용 프로그램입니다. Access의 작동 방식과 적합한 사용 사례를 알아보세요.

Word 2010에서 눈금선 높이와 너비 변경하기

Word 2010에서 눈금선 높이와 너비 변경하기

Word 2010에서 격자선 높이와 너비를 조정하고, 표시되는 선의 빈도를 변경하고, 기본 가로 및 세로 그리기 격자 간격을 설정하는 방법을 알아보세요.

Office Outlook 2010 가져오기 및 내보내기: PST 파일을 이용한 데이터 이동

Office Outlook 2010 가져오기 및 내보내기: PST 파일을 이용한 데이터 이동

Outlook 2010으로 PST 파일을 가져오거나 메일, 연락처, 일정 및 작업을 내보내는 방법을 알아보세요. 올바른 메뉴를 따라가면 폴더 누락이나 중복을 방지할 수 있습니다.

Nucleus Kernel을 사용하여 Outlook PST 암호 복구하기

Nucleus Kernel을 사용하여 Outlook PST 암호 복구하기

Kernel에서 제공하는 최신 단계를 따라 잊어버린 Outlook PST 암호를 복구하세요. 여기에는 올바른 파일을 식별하는 방법, 백업을 만드는 방법, 도구의 한계를 확인하는 방법이 포함됩니다.

파워포인트 슬라이드에 웹페이지를 삽입하는 방법

파워포인트 슬라이드에 웹페이지를 삽입하는 방법

LiveWeb 추가 기능을 사용하여 PowerPoint 슬라이드에 웹사이트를 배치하고, 크기와 새로 고침 동작을 설정하고, 발표 전에 호환성을 확인할 수 있습니다.

Access 2010 데이터베이스를 폼에서 열 수 있도록 하는 방법

Access 2010 데이터베이스를 폼에서 열 수 있도록 하는 방법

Access 2010 데이터베이스 응용 프로그램을 데이터 입력 양식으로 바로 열도록 설정하고, 개체 목록을 숨기고, 메뉴를 제한하고, 공유하기 전에 설정을 확인합니다.