# 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 결과를 받습니다.
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 모듈 초기화와 파일 로드는 최소한의 코드로 가능합니다. 엔진이 자동으로 유형을 감지합니다.
// 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() 메서드는 쿼리 실행 없이 데이터 구조를 반환합니다:
{
"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
아직 댓글이 없습니다.