| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |
- 데이터구조
- 소프트웨어
- 프로그래밍언어
- 데이터과학
- 클라우드컴퓨팅
- Yes
- 버전관리
- 딥러닝
- 웹개발
- 프로그래밍
- 자료구조
- 컴퓨터비전
- I'm Sorry
- 네트워크보안
- 자바스크립트
- 컴퓨터과학
- 컴퓨터공학
- 데이터베이스
- 알고리즘
- 파이썬
- 네트워크
- 소프트웨어공학
- 데이터분석
- 머신러닝
- 보안
- springboot
- 사이버보안
- 디자인패턴
- 인공지능
- 빅데이터
- Today
- Total
스택큐힙리스트
어떻게 노드.js HTTP 서버를 사용하여 몽고디비로부터 대량의 행을 반환하는지 알려주세요. 본문
메모리가 부족한 경우에 실패합니다. 이 예시는 node-mongodb-native 드라이버와 기본 http 패키지를 사용합니다.
치명적인 오류: CALL_AND_RETRY_2 할당 실패 - 메모리 부족
(실제 시나리오에서는 필요에 따라 결과를 제한하는 매개 변수를 사용하지만, 이 예시에서는 어떠한 경우에도 모두 쿼리합니다.)
데이터 자체는 간단합니다.
{ _id : ObjectId(4f993d1c5656d3320851aadb), userid : 80ec39f7-37e2-4b13-b442-6bea57472537, user-agent : Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322), ip : 127.0.0.1, lastupdate : 1335442716 }
또 다른 시도로는
while(cursor != null)
{
cursor.nextObject(function(err, item) {
response.write(JSON.stringify(item));
});
}
하지만 이것도 메모리가 부족했습니다.
어떻게 진행해야 할까요? 데이터를 행별로 스트리밍하는 방법이 있어야 하는데, 적합한 예제를 찾지 못했습니다. 외부 응용 프로그램 요구 사항 때문에 데이터의 페이징은 불가능합니다. 데이터를 파일에 작성한 다음 게시하는 방법을 생각했지만, 원하지 않는 I/O로 이어집니다.
답변 1
네이티브 MongoDB 드라이버의 cursor.streamRecords() 메서드는 사용이 중단되었습니다.
대신 stream() 메서드를 사용하면 더 빠릅니다.
Mongodb + stream() + process.nextTick()으로 4,000,000개의 행으로 된 카탈로그 문서를 문제없이 파싱했습니다.
답변 2
높은 데이터 처리 능력을 가진 MongoDB와 함께 Node.js HTTP 서버를 사용하여 대량의 행을 반환하는 방법에 대해 알아보겠습니다.Node.js는 비동기 이벤트 기반 서버 사이드 플랫폼으로, JavaScript를 사용하여 서버 애플리케이션을 구축할 수 있습니다. MongoDB는 유연하고 확장 가능한 문서 지향 NoSQL 데이터베이스로, 대용량 데이터 처리에 특화되어 있습니다. 이 두 기술을 결합하여 대량의 행을 반환하는 강력한 애플리케이션을 개발할 수 있습니다.
첫 번째 단계는 Node.js HTTP 서버를 설정하는 것입니다. HTTP 모듈을 사용하여 서버를 만들고, 포트 번호를 지정하고, 클라이언트 요청을 수신하는 이벤트 핸들러를 작성해야 합니다. 서버를 시작하기 위해 다음 코드를 작성할 수 있습니다.
```
const http = require('http');
const port = 3000;
const server = http.createServer((req, res) => {
// 요청 처리 로직을 작성합니다.
});
server.listen(port, () => {
console.log(`Server running at http://localhost:${port}/`);
});
```
두 번째 단계는 MongoDB와 연결하고 대량의 행을 가져오는 것입니다. 먼저 MongoDB Node.js 드라이버를 설치해야 합니다. 이를 위해 npm(Node Package Manager)을 사용할 수 있습니다. 터미널에서 다음 명령을 실행하여 드라이버를 설치합니다.
```
npm install mongodb
```
이제 데이터베이스에 연결하고 컬렉션에서 데이터를 질의하여 반환하는 로직을 작성할 수 있습니다. 다음 코드를 참조하세요.
```
const MongoClient = require('mongodb').MongoClient;
const url = 'mongodb://localhost:27017/mydb';
// 컬렉션에서 모든 문서를 반환하는 함수
function getAllDocuments(collectionName) {
return new Promise((resolve, reject) => {
MongoClient.connect(url, { useUnifiedTopology: true }, (err, client) => {
if (err) reject(err);
const db = client.db('mydb');
const collection = db.collection(collectionName);
collection.find({}).toArray((err, docs) => {
if (err) reject(err);
resolve(docs);
client.close();
});
});
});
}
// 클라이언트 요청을 처리하는 핸들러
const handleRequest = async (req, res) => {
try {
const documents = await getAllDocuments('mycollection');
res.writeHead(200, { 'Content-Type': 'application/json' });
res.end(JSON.stringify(documents));
} catch (error) {
res.writeHead(500, { 'Content-Type': 'text/plain' });
res.end('Internal Server Error');
}
};
// HTTP 서버에서 요청 핸들러 등록
const server = http.createServer(handleRequest);
// 서버 시작
server.listen(port, () => {
console.log(`Server running at http://localhost:${port}/`);
});
```
위의 코드는 MongoDB에 연결하고 'mycollection' 컬렉션에서 모든 문서를 가져옵니다. 요청이 수신되면 getAllDocuments 함수를 호출하여 문서를 가져온 다음 JSON 형식으로 클라이언트에 응답합니다. 예외 발생 시 500 상태 코드로 응답합니다.
이제 위의 코드를 사용하여 대량의 행을 반환하는 MongoDB와 함께 Node.js HTTP 서버를 구축할 수 있습니다. 이를 통해 사용자가 애플리케이션에서 필요로 하는 많은 양의 데이터를 효과적으로 처리할 수 있습니다. 일반적으로 대량의 데이터를 반환할 때는 페이징 기법을 이용하여 한 번에 모든 데이터를 반환하는 것보다 적절한 수의 데이터만 반환하는 것이 성능상 이점이 있습니다.
이 글은 MongoDB와 Node.js HTTP 서버를 통해 대량의 데이터를 처리하는 방법에 대해 설명했습니다. 이를 통해 검색 최적화(SEO)를 고려한 한국어 글을 작성했습니다. 대량의 데이터 처리를 위해 이러한 기술을 사용하는 것은 애플리케이션의 성능과 확장성을 향상시킬 수 있는 좋은 방법입니다.