도움이 필요하다! 숙제가 풀리지 않아 철의 한계에 부딪혀

 

많은 양의 정보가 있습니다(텍스트 파일의 경우 약 20GB).

정보는 동일한 유형의 시퀀스로 구성되며 약 백만 개 있습니다.

모든 시퀀스 를 반복적으로 정렬하고 몇 가지 계산을 해야 합니다.

가장 먼저 떠오르는 것은 파일의 전체 내용을 읽고 구조 배열로 채우고 메모리에서 작업하는 것입니다.

그러나 다음 크기 조정에서 MT는 "메모리 처리기: 5610000바이트의 메모리를 할당할 수 없습니다"라고 맹세합니다.

동시에 디스패처는 terminal.exe가 3.5GB의 RAM(16개의 물리적 메모리 중)을 사용한다고 말합니다. 프로세스가 4GB만 받을 수 있기 때문인 것으로 알고 있습니다.

시작하기 전에

2% 읽기

6% 읽기

12% 읽기

15% 읽기

모두...

EA는 "메모리가 충분하지 않습니다( 4007Mb 사용, 88Mb 사용 가능, 4095Mb 총계)!!!"라고 말합니다.

그리고 이것은 필요한 볼륨의 15.3%에 불과합니다(앞으로 더 늘리고 싶습니다).


옵션 번호 2 - 파일을 읽을 때마다. 원하는 조각을 찾아 구조에 저장하고 다음 조각을 읽고 결과를 비교하고 구조를 덮어씁니다.

그리고 이 시퀀스를 한 번 거쳐야 한다면 그렇게 할 것입니다. 그러나 조금씩 앞으로 나아갈 때마다 반복해서 통과해야 합니다.

따라서 여러 번 읽어야 하며 다음과 같습니다.

  • 너무 느려
  • 나사에 구멍을 뚫다
결과를 위해 며칠을 기다릴 준비가 되었는지 잘 모르겠습니다...

정보량도 속상하다... 10기가가 되어 램디스크(사실상, 메모리)로 옮겨가서 읽고 싶은 만큼 읽었다. 예?

그리고 더 이상 상상력이 부족합니다.

많은 조각을 얻을 수 있도록 이러한 시퀀스를 재구성하려고 시도하지만 각 조각에는 현재 필요한 정보만 포함되어 있습니까?

여전히 데이터를 압축하려면(I 등은 가능한 모든 곳에서 char로 float)? 그러나 이것은 또 다른 최대 10-20%를 줄 것이고, 나는 크기를 한 단계 더 줄여야 합니다.

어떻게 생각하는지 말해봐, 친구들. 내 뒤에 녹슬지 않을거야)

 

komposter :

어떻게 생각하는지 말해봐 친구들. 내 뒤에 녹슬지 않을거야)

옵션으로...

1. 캐시를 만드십시오. 이 경우 메모리에 있는 것을 관리하게 됩니다. 알고리즘을 알고 있으므로 캐시를 효율적으로 만들 수 있습니다.

2. 파일에 매핑을 사용합니다. Windows 자체가 필요한 것을 캐시하므로 나사가 끼지 않습니다.

 
TheXpert :

옵션으로...

1. 캐시를 만드십시오. 이 경우 메모리에 있는 것을 관리하게 됩니다. 알고리즘을 알고 있으므로 캐시를 효율적으로 만들 수 있습니다.

2. 파일에 매핑을 사용합니다. Windows 자체가 필요한 것을 캐시하므로 나사가 끼지 않습니다.

1. 이것은 캐시입니다... 아니면 무슨 말인지 이해가 되지 않습니다. 필요한 부분을 지속적으로 읽는 내 변형?

2. 조금 더 자세히 말씀해 주시겠습니까? 매핑은 무엇을 제공하고 어느 쪽에서 접근해야 합니까?

 
매핑에 대해 입력하기 시작합니다. 지금은 여전히 마나를 연구하고 있고, 광산으로 향하고 있습니다)
 

젠장...

32-битные архитектуры (Intel 386, ARM 9) не могут создавать отображения длиной более 4 Гб

같은 계란, 측면 만. 읽기 속도가 빨라질 수 있지만 이것이 전 세계적으로 문제를 해결하는 것은 아닙니다.

 

또 다른 생각은 모든 것을 DB(MySQL?)로 옮기고 작업하는 것입니다. 이론적으로 데이터베이스는 이러한 볼륨과 지속적인 삽질에 맞게 조정됩니다.

전문가가 있습니까? 누가 뭐라고 할까요?

 

1) 알고리즘을 어떻게든 변경할 수 있습니까? 처리할 블록(2GB)을 로드하려면 결과를 저장하고(짧게) 메모리를 비우고 다음 블록을 로드합니다...

그리고 마지막에 모든 결과를 다시 처리합니다.

2) 많은 메모리 작업이 해시, B-트리(및 해당 수정)를 기반으로 하는 결정과 관련되어 데이터베이스에 업로드됩니다.

 
ALXIMIKS :

1) 알고리즘을 어떻게든 변경할 수 있습니까? 처리할 블록(2GB)을 로드하려면 결과를 저장하고(짧게) 메모리를 비우고 다음 블록을 로드합니다...

그리고 마지막에 모든 결과를 다시 처리합니다.

2) 많은 메모리 작업이 해시, B-트리(및 해당 수정)를 기반으로 하는 결정과 관련되어 데이터베이스에 업로드됩니다.

1. 나는 이것에 대해 썼습니다 - 당신은 할 수 있지만 문제는 데이터를 여러 번 처리해야한다는 것입니다. 매우 느릴 것입니다.

2. 내일은 제가 직접 구글링해보겠습니다. 간단한 설명을 해주시면 감사하겠습니다.

 
komposter :

1. 나는 이것에 대해 썼습니다 - 당신은 할 수 있지만 문제는 데이터를 여러 번 처리해야한다는 것입니다. 매우 느릴 것입니다.

2. 내일은 제가 직접 구글링해보겠습니다. 간단한 설명을 해주시면 감사하겠습니다.

비슷한 문제와 C ++로 해결하기 위한 옵션에 대해 토론한 사이트 가 생각났습니다.

Отсортировать строки в файле размером 3GB | FulcrumWeb
Отсортировать строки в файле размером 3GB | FulcrumWeb
  • www.fulcrumweb.com.ua
Необходимо написать алгоритм, который бы смог отсортировать строки в файле большого размера (от 2-х до 4-х Gigabytes). Результатом выполнения должен быть другой файл. За хорошую реализацию гарантированный приз – флешка для хранения таких файлов и, возможно, предложение работы в нашей компании.
 
물론 미안하지만 64비트를 시도하거나 MT가 32비트만 된다면
나는 순진하게 그런 고도의 수학적 것이 64비트에서 회전해야 한다고 생각했습니다.
항공기의 공기 역학을 계산하기 위해 동일한 프로그램을 사용하므로 원칙적으로 32x에서 작동하지 않습니다.
자동차가 32배 더 빠르게 움직인다는 주요 주장에 대해 알고 있지만 이것은 실제로 하드웨어 문제입니다 IMHO
 

1. 당연히 x64 시스템을 사용합니다.

2. Amazon EC2 클라우드에서 더 강력한 시스템을 임대하고 계산합니다.

3. 압축된 데이터를 사용하고 메모리에서 즉석에서 압축을 해제합니다. 실제 데이터는 스트림(부호/가수/지수)으로 분할할 때 더 잘 압축됩니다. 12비트 부동 소수점을 사용할 수 있습니다(정밀도를 희생하여).

4. EA 외부에서 빅 데이터(Matlab/R/etc)로 작업할 수 있는 계산을 수행합니다.