MariaDB, Sequelize 및 Node.js를 사용하여 수백만 개의 레코드를 가져와 DevExtreme PivotGrid에 표시
제목은 이미 그것을 요약하고 있다.
저는 현재 이 작업에 직면해 있습니다. SELECT 스테이트먼트는 360만 개의 레코드와 많은 컬럼을 생성합니다.이 완전한 데이터 팩을 클라이언트에 전송하여 브라우저가 모든 데이터를 피벗 그리드에 표시할 수 있도록 해야 합니다.그래서 불행히도 페이지 매김은 선택사항이 아닙니다.
클라이언트 측에서 사용되는 스택은 MariaDB, Node.js v8.11.3, Sequelize v3 및 DevExtreme입니다.
예상대로 노드 서버는 이 양의 데이터로 크래시합니다.
웹 어플리케이션으로는 아직 할 수 없다는 결론에 도달해 주신다면, 어떻게 실현될 수 있는지, 혹은 그러한 작업에 대한 경험이 있다면, 어떤 아이디어라도 주시면 감사하겠습니다.
정말 고맙고 좋은 하루 되세요!
패트릭
당신의 질문에 답하기 위해: 당신은 할 수 없습니다.
대규모 데이터 세트를 클라이언트에 직접 제공하는 것은 일반적으로 좋지 않습니다.예제 데이터가 행당 1kb인 경우 3Gb의 데이터를 로드한다고 가정해 보십시오.네트워크상에서 대량의 데이터를 송신할 필요가 있기 때문에, 서버나 클라이언트의 메모리가 부족하거나, 문제가 없는 경우는, 로드해 사용하는 것이 매우 늦어집니다.
여기에는 간단한 해결책은 없지만 데이터가 어떻게 존재하는지 다시 생각해보고 데이터 집약만 전송하거나 페이지화(devexpress의 pivot table은 그렇게 하지 않음)를 사용하는 클라이언트 라이브러리를 사용하면 많은 데이터를 전송할 필요가 없습니다.
질문의 일부만 답하면 스트리밍이나 웹 소켓 등의 기술을 사용하여 클라이언트에 전송하기 전에 데이터 세트 전체를 메모리에 로드하지 않도록 함으로써 Node.js의 크래시를 방지할 수 있습니다.
360만 행각 행에 128바이트의 데이터가 있다고 가정합니다. 즉, 460,800,000바이트는 선택하려는 439MB의 원시 데이터입니다. 그리 나쁘지 않은 것 같습니다.그러나 이 데이터는 객체/모델로 포장되거나 json으로 변환되므로 메모리 요구량은 최소 10배입니다.4.3GB
좋아, 그래도 나쁘지 않아.이제 브라우저에 푸시하고 스타일링하고 html, json 등으로 랩해야 합니다.대략 1.4를 밀어넣을 것이다.클라이언트에 대한 GB(단위: json). 클라이언트는 정상적으로 다운로드됩니다.json은 브라우저에 있다.물건으로 변하고 있어요.메모리 곱하기 대략 4. 5.6GB. 그다지 초라하지는 않지만, 탭당 메모리 제한이 256MB이기 때문에 브라우저가 고장납니다(게임 코딩 시 발생하는 메모리는 브라우저마다 다릅니다).
단, json 상에서 반복하여 디스플레이와 같은 스프레드시트를 만들고, 모든 DOM 노드를 만들고, 그것들을 DOM 트리에 연결하거나, 이벤트 핸들러를 연결할 수 있는 사용자 정의 무제한 브라우저라고 가정해 보겠습니다.메모리 곱하기 20: 112GB
따라서 고객은 엄청난 용량의 RAM을 탑재한 대규모 게임용 리그, 주소 지정 공간을 처리할 수 있는 브라우저 및 이를 처리할 수 있는 OS를 보유하고 있습니다.이제 페이징이라는 재미있는 영역에 들어갑니다.사용자가 화면을 응시하는 동안 너무 많은 양의 메모리가 사용되지 않고 OS가 실행하는 우선순위가 높은 태스크가 있기 때문에 OS는 해당 RAM을 호출해야 합니다.마이크로초는 낭비되지 않습니다.디스크에 쓰고, 스크롤할 때마다 디스크에서 읽고, 클라이언트의 하드 드라이브를 삭제합니다.
즉, 브라우저는 메모리 제한이 있기 때문에 이를 허용하지 않습니다.커스텀 OS, 커스텀 브라우저, 커스텀 컴퓨터가 필요하지만 CPU의 제약으로 인해 속도가 느려지는 것을 고객에게 설명합니다.
Google Docs를 사용하여 필요에 따라 로드합니다.사용자가 스크롤하면 필요한 디스플레이 데이터를 로드하고 화면 밖에 있는 데이터를 5분 동안 언로드하여 256MB 제한을 넘지 않도록 합니다.쿼리를 구성하면 오프셋을 설정하고 원하는 결과 수를 제한하는 간단한 질문입니다.나머지 물건들도 똑같이 작동합니다.
현실 세계에는 한계가 있지만, 고객의 희망에는 한계가 없습니다.균형을 잡아라.
언급URL : https://stackoverflow.com/questions/59769109/fetching-millions-of-records-with-mariadb-sequelize-node-js-to-display-in-dev
'programing' 카테고리의 다른 글
Numpy: 2D 어레이에서 행 집합을 무작위로 가져옵니다. (0) | 2022.11.27 |
---|---|
이클립스를 위한 최고의 GUI 디자이너? (0) | 2022.11.26 |
Larabel 및 웅변가 표에서 모두 선택 (0) | 2022.11.26 |
Jvm이 localhost의 ip-address를 확인하는 데 시간이 오래 걸림 (0) | 2022.11.26 |
선택한 특정 열을 새 DataFrame에 복사본으로 추출하는 중 (0) | 2022.11.26 |