브라우저에서 거대한 데이터 세트 (1,000 만 행 읽기)를 처리 할 수 있어야하는 CSV 파서를 개발 중입니다.배열의 메모리 사용
메인 스레드가 20메가바이트의 덩어리를 읽고, 그렇지 않으면 브라우저가 신속하게 충돌 할, 다음과 같이
는 기본적으로 파서는 작동합니다. 그 후, 데이터 청크를 작업자 중 한 명에게 보냅니다.
작업자가 데이터를 받고 원하지 않는 열을 삭제하고 원하는 작업을 저장합니다. 일반적으로 20-30 개 중 4-5 개의 열만 있으면됩니다.
작업자는 처리 된 데이터를 다시 주 스레드로 보냅니다.
주 스레드는 데이터를 받아 데이터 배열에 저장합니다.
파일이 완료 될 때까지 1 - 4 단계를 반복하십시오. 데이터 세트 (crimes city of chicago), I (71 개)가 다른 배열의 내부에 보유하고 이러한 열 각각 포함 +/- 90K 소자 어레이와 함께 단부와 단부에서
. 이 90K 요소는 각각 5 개의 문자열 (읽기 파일에서 가져온 열)을 포함합니다. 즉, 위도, 경도, 연도, 블록 및 IUCR.
요약하면 71은 데이터 세트에서 20MB의 청크 수이고, 90K는 각 청크에서 20MB의 행 수이며 5는 추출 된 열입니다.
브라우저 (Chrome)에서 메모리가 너무 많아서 Chrome, Opera, Vivaldi 및 Firefox의 4 가지 브라우저를 사용하고 탭에서 사용하는 메모리를 기록했습니다.
- 크롬 - 1.76GB
- 오페라 - 1.76GB
- 파이어 폭스 - 1.3GB
- 비발디 - 1기가바이트
내가 같은 배열을 다시하려고하면하지만 모의 데이터, 그것을 대략만을 사용합니다. 메모리 350MB의 :
var data = [];
for(let i = 0; i < 71; i++){
let rows = [];
for(let j = 0; j < 90*1000; j++){
rows.push(["029XX W MADISON ST", "2027", "-87.698850575", "2001", "41.880939487"])
}
data.push(rows);
}
내가 배열이 정적 인 경우, 위의 코드에서 볼 수 있듯이, 그것은 동적 경우보다 성능이보다 쉽게 이해합니다. 하지만 같은 양의 데이터에 대해 5 배 더 많은 메모리를 사용할 것으로 기대하지는 않았습니다.
파서에서 메모리를 줄이기 위해 할 수있는 일이 있습니까?
정말 브라우저에서이 작업을 수행해야한다고 생각하지 않습니다. –
당신은 서버 (어쩌면 nodejs)에서 실행할 수 있습니다, 그것은 변화하는 환경/메모리에 의존하지 않고 스트림이라고하는 좋은 구현을 가지고 있습니다 ... –
@torazaburo 아마 당신은 옳습니다. 왜 내가하지 말아야하는지 이유를 말해 줄 수 있니? –