2017-05-21 2 views
0

브라우저에서 거대한 데이터 세트 (1,000 만 행 읽기)를 처리 할 수 ​​있어야하는 CSV 파서를 개발 중입니다.배열의 메모리 사용

  1. 메인 스레드가 20메가바이트의 덩어리를 읽고, 그렇지 않으면 브라우저가 신속하게 충돌 할, 다음과 같이

    는 기본적으로 파서는 작동합니다. 그 후, 데이터 청크를 작업자 중 한 명에게 보냅니다.

  2. 작업자가 데이터를 받고 원하지 않는 열을 삭제하고 원하는 작업을 저장합니다. 일반적으로 20-30 개 중 4-5 개의 열만 있으면됩니다.

  3. 작업자는 처리 된 데이터를 다시 주 스레드로 보냅니다.

  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. 크롬 - 1.76GB
  2. 오페라 - 1.76GB
  3. 파이어 폭스 - 1.3GB
  4. 비발디 - 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 배 더 많은 메모리를 사용할 것으로 기대하지는 않았습니다.

파서에서 메모리를 줄이기 위해 할 수있는 일이 있습니까?

+0

정말 브라우저에서이 작업을 수행해야한다고 생각하지 않습니다. –

+0

당신은 서버 (어쩌면 nodejs)에서 실행할 수 있습니다, 그것은 변화하는 환경/메모리에 의존하지 않고 스트림이라고하는 좋은 구현을 가지고 있습니다 ... –

+0

@torazaburo 아마 당신은 옳습니다. 왜 내가하지 말아야하는지 이유를 말해 줄 수 있니? –

답변

0

기본적으로 적은 메모리를 사용하려면 몇 가지 기술을 사용할 수 있습니다.

먼저 숫자가 포함 된 CSV 열을 변환하여 그대로 사용해야합니다. Javascript의 숫자는 8 바이트이지만 문자열과 동일한 숫자는 훨씬 많은 공간 (문자 당 2 바이트)을 차지합니다.

다른 작업은 작업이 완료되면 모든 작업자를 종료하는 것입니다.

관련 문제