새로운 형식으로 매핑하고 새 DB에 업로드해야하는 매우 큰 (> 500MB) JSON 파일이 있습니다.여러 객체를 스트림의 단일 객체에 매핑
이전 형식 :
{
id: '001',
timestamp: 2016-06-02T14:10:53Z,
contentLength: 123456,
filepath: 'original/...',
size: 'original'
},
{
id: '001',
timestamp: 2016-06-02T14:10:53Z,
contentLength: 24565,
filepath: 'medium/...',
size: 'medium'
},
{
id: '001',
timestamp: 2016-06-02T14:10:53Z,
contentLength: 5464,
filepath: 'small/...',
size: 'small'
}
새로운 형식 :
{
Id: '001',
Timestamp: 2016-06-02T14:10:53Z,
OriginalSize: {
ContentLength: 123456,
FilePath: 'original/...'
},
MediumSize: {
ContentLength: 24565,
FilePath: 'medium/...'
},
SmallSize: {
ContentLength: 5464,
FilePath: 'small/...'
}
}
I는, 이와 같은 작은 데이터 셋이 달성 먼저 '원본'크기를 처리 하였다
let out = data.filter(o => o.size === 'original).map(o => {
return {
Id: o.id,
Timestamp: o.timestamp,
OriginalSize: {
ContentLength: o.contentLength,
FilePath: o.filepath
}
};
});
data.filter(o => o.size !== 'original').forEach(o => {
let orig = out.find(function (og) {
return og.Timestamp === o.timestamp;
});
orig[o.size + 'Size'] = {
ContentLength: o.contentLength,
FilePath: o.filepath
};
)
// out now contains the correctly-formatted objects
이 문제는 수백 메가 바이트의 JSON을 메모리에로드 할 수없는 매우 큰 데이터 세트에서 발생합니다 한꺼번에. 이것은 스트림을 사용하는 좋은 시간 인 것 같습니다. 물론 파일을 청크로 읽는다면 .find()를 작은 배열로 실행하면 '원본'크기를 찾을 수 없습니다. 전체 파일을 스캔하여 원본을 찾은 다음 다시 스캔하여 내가 찾은 것에 다른 크기를 추가하면 어쨌든 전체 데이터 세트로 끝납니다.
나는 JSONStream을 알고 있는데, 내 물건을 간단한 1-1 매핑으로하면 멋질 것입니다.
분명히 나는 이런 종류의 문제에 부딪 칠 수있는 첫 번째 사람이 될 수 없습니다. 과거에 어떤 솔루션이 사용 되었습니까? 어떻게 접근 할 수 있습니까?
서로 다른 차원의 객체가 항상 입력 배열에서 서로 인접합니까? – Bergi
ID가 아닌 타임 스탬프로 일치 시키시겠습니까? – Bergi
예가 잘못되었을 수 있습니다. 불행히도 객체는 전혀 인접하지 않으며 파일의 어느 곳에 나있을 수 있습니다. 그리고 네, 타임 스탬프에 의한 매칭은 제가 원하는 것입니다. 이것은 특정 ID를 가진 모든 레코드에서 작동하므로 여기서 너무 중요하지 않습니다. –