JSON에 저장된 사용자 테이블을 나타내는 Firebase 데이터베이스의 덤프가 있습니다. 일부 데이터 분석을 실행하고 싶지만 메모리에 완전히로드하고 순수한 JavaScript (또는 _
및 유사한 라이브러리)를 조작하기에는 너무 커서 문제가됩니다.JSON 객체를 다루기에 너무 커서 메모리에 맞을 수 없습니다.
지금까지 나는 JSONStream 패키지를 사용하여 바이트 크기의 청크로 데이터를 처리했습니다. JSON 덤프에서 각 사용자마다 한 번 콜백을 호출합니다.
나는 이제 필터 자신의 가치에 기반한 내 사용자 ID를 원하기 때문에로드 블록을 쳤습니다. 내가 대답하려고하는 "질문"은 "어떤 사용자 x"인지에 대한 질문입니다. 이전에 "얼마나 많은 사용자 x"를 물어 보았고 누구인지 알 필요가 없었습니다.
데이터 형식은 다음과 같이이다 :
{
users: {
123: {
foo: 4
},
567: {
foo: 8
}
}
}
내가하고 싶은 것은 본질적으로 foo
의 값에 따라 사용자 ID (위의 123
또는 567
)를 얻을 수있다. 자, 이것이 작은리스트라면 _.each
과 같은 것을 사용하여 키와 값을 반복하고 원하는 키를 추출하는 것이 쉽습니다.
불행히도 메모리에 맞지 않아 작동하지 않습니다. JSONStream으로 나는 var parser = JSONStream.parse('users.*');
를 사용하여 이런 식으로 다루는 함수로 배관하여 반복 할 수 있습니다
var stream = fs.createReadStream('my.json');
stream.pipe(parser);
parser.on('data', function(user) {
// user is equal to { foo: bar } here
// so it is trivial to do my filter
// but I don't know which user ID owns the data
});
그러나 문제는 내가 스타 와일드 카드를 나타내는 키에 액세스 할 수없는 것입니다 그 I JSONStream.parse
로 전달되었습니다. 즉, { foo: bar}
이 사용자 123
또는 사용자 567
을 나타내는 지 여부는 알 수 없습니다.
질문은 두 가지이다 :
- 가 어떻게 내 콜백 내에서 현재 경로를 얻을 수 있나요?
- 메모리에 저장하기에는 너무 큰이 JSON 데이터를 처리하는 더 좋은 방법이 있습니까?
1. 전혀 할 수 없습니다. 절대 일어나지 않을 것입니다 (현재 구조 사용). 왜이 JSON을 실제 데이터베이스 (예 : MySQL)에 넣고 실제로 쿼리하여 분석을 수행할까요? – Adam
Can not what? 데이터보다 기술적으로 경로에 액세스 할 수있는 방법이 있습니까? –
콜백에서 알아 낸대로'경로 '가 없으며 데이터 만 있습니다. 컨텍스트가없고 JSON 문자열의 "child"객체는 어디에서 왔는지 개념이 없습니다. – Adam