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

Andrey Khatimlianskii  

많은 양의 정보가 있습니다(텍스트 파일의 경우 약 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%를 줄 것이고, 나는 크기를 한 단계 더 줄여야 합니다.

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

TheXpert  

komposter :

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

옵션으로...

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

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

Andrey Khatimlianskii  
TheXpert :

옵션으로...

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

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

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

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

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

젠장...

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

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

Andrey Khatimlianskii  

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

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

Sergey Dzyublik  

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

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

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

Andrey Khatimlianskii  
ALXIMIKS :

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

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

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

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

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

Sergey Dzyublik  
komposter :

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

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

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

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

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

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

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

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

사유: