홈으로 돌아가기

브라우저에서 Excel 및 Parquet용 WebAssembly SQL

이 글은 브라우저에서 Excel, CSV, Parquet을 파싱하기 위한 WebAssembly 상 C++ SQL 엔진을 설명합니다. Workbook은 파일을 가상 테이블로 마운트하며 JOIN을 지원합니다. API 예제, 메타데이터 및 오프라인 분석 사용 사례를 제공합니다.

브라우저에서 C++ SQL: WebAssembly 상 Parquet 및 Excel 파싱
Advertisement 728x90

# C++와 WebAssembly를 사용한 브라우저 내 Excel, CSV, Parquet SQL 분석

WebAssembly를 사용하면 브라우저에서 직접 표 형식 데이터를 파싱하는 C++17 코드를 실행할 수 있습니다. excel_loader 기반 솔루션은 파일을 SQL 테이블로 가상화합니다: XLSX, Parquet, CSV는 메모리에 완전히 로드하지 않고 마운트됩니다. 이는 JS 라이브러리에서 흔한 UI 블로킹과 메모리 누수를 없애며, 사용자 데이터를 기기 내에서만 유지하여 프라이버시를 보장합니다.

아키텍처는 C++ 코어, Emscripten 상호 운용성, JS 래퍼를 결합합니다. 엔진은 blob 시그니처로부터 형식을 감지하며, 단일 Workbook 내에서 이종 파일 간 JOIN을 지원합니다.

아키텍처: 파싱부터 SQL 쿼리까지

excel_loader의 C++ 코어는 네이티브 라이브러리를 사용해 파싱을 처리하고, 가상 테이블을 구축하며 쿼리를 계획합니다. Emscripten은 ExcelLoaderEngine, Workbook, QueryResult 클래스를 JS로 내보냅니다. 클라이언트 레이어는 입력 ArrayBuffer를 전달하고 JSON 결과를 받습니다.

Google AdInline article slot

Workbook은 중앙 추상화입니다: 여러 파일을 단일 데이터베이스로 취급하는 컨테이너입니다. 지원 형식:

  • Excel/Office: XLSX, XLSB, XLS, ODS
  • Flat Files: CSV, TSV, TXT
  • Columnar/BigData: Parquet, DuckDB, ORC, AVRO
  • Legacy DB: SQLite, DBF, MDB, ACCDB
  • NoSQL/Docs: JSON, JSONL, XML, HTML

자동 형식 감지는 통합을 간소화합니다: 프론트엔드는 전처리 없이 Uint8Array를 전달합니다.

실전 API 구현

WASM 모듈 초기화와 파일 로드는 최소한의 코드로 가능합니다. 엔진이 자동으로 유형을 감지합니다.

Google AdInline article slot
// Initialization WASM-modulya
const module = await ExcelLoaderModule();
const engine = new module.ExcelLoaderEngine();

// Poluchaem file from standartnogo input
const fileInput = document.getElementById("fileUploader");
const file = fileInput.files[0];
const arrayBuffer = await file.arrayBuffer();

// Otkryvaem file how Workbook
const workbook = engine.openSingleFile(
    file.name, 
    new Uint8Array(arrayBuffer)
);

window.currentWorkbook = workbook;

마운트된 파일에 SQL 쿼리 실행:

const sql = "SELECT * FROM 'Sheet1' WHERE Amount > 1000 ORDER BY Date DESC LIMIT 10";

try {
    const result = window.currentWorkbook.executeQuery(sql);
    const data = result.toJSON(); 
    console.table(data);
} catch (e) {
    console.error("SQL Error:", e);
}

다중 파일 프로젝트의 경우 JSON 매니페스트 사용:

// manifest.json
{
  "files": [
    { "name": "data_2023.parquet", "alias": "History" },
    { "name": "new_orders.csv", "alias": "Current" }
  ]
}
const workbook = openProjectFromManifest(engine, manifestJson, fileBuffers);
// Dostupno: SELECT * FROM History JOIN Current ...

메타데이터와 성능

getStats() 메서드는 쿼리 실행 없이 데이터 구조를 반환합니다:

Google AdInline article slot
{
    "name": "sheet1$",
    "displayName": "Otchet_Prodazhi",
    "fileName": "report_final.xlsx",
    "type": "excel-sheet",
    "rows": 15400,
    "columns": 24,
    "memoryUsage": "..."
}

C++의 인메모리 작업은 V8 대비 오버헤드를 최소화합니다. Parquet는 컬럼 형식과 벡터화 덕분에 효율적으로 읽습니다.

주요 성능 이점:

  • 50+ MB 파일 파싱 시 UI 블로킹 없음
  • 서버 없이 XLSX와 CSV 간 JOIN
  • JS 대안(SheetJS, AlaSQL) 대비 최소 메모리 사용
  • UI를 위한 오프라인 메타데이터 액세스

개발에서의 응용

이 솔루션은 미들/시니어 프론트엔드 및 풀스택 개발자에게 이상적입니다.

  • 로컬 우선 대시보드: 데이터를 어디에도 보내지 않는 완전 오프라인 분석
  • 클라이언트 측 검증: 업로드 전 파일 검사 SQL 규칙
  • 컨버터: 브라우저 내 Parquet → SQL 필터 → JSON/CSV
  • Office 에디터 확장: 웹 버전 셀에 SQL 쿼리

주요 포인트

  • 가상 테이블은 파일을 RAM에 완전히 로드하지 않고 마운트
  • blob 시그니처로부터 15+ 형식 자동 감지
  • Workbook은 이종 소스 간 JOIN을 단일 데이터베이스로 지원
  • WASM을 통한 C++은 대용량 데이터셋에서 JS를 능가
  • 완전 프라이버시: 데이터가 브라우저를 떠나지 않음

— Editorial Team

Advertisement 728x90

다음 읽기