Precisa de ajuda! Não consigo resolver o problema, estou atingindo limitações de hardware

 

Há uma grande quantidade de informações (cerca de 20 GB em um arquivo de texto).

As informações consistem no mesmo tipo de seqüências, cerca de um milhão delas.

É necessário passar por todas as seqüênciasrepetidamente e fazer alguns cálculos.

A primeira coisa que vem à mente é ler todo o conteúdo do arquivo, preencher o conjunto de estruturas com ele e trabalhar com elas em memória.

Mas dá errado, com o próximo redimensionamento da MT jura "Memory handler: cannot allocing 5610000 bytes de memória".

O despachante mostra que o terminal.exe usa 3,5 GB de RAM (de 16 físicas). Presumo que isto se deva ao fato de que o processo só pode obter 4GB.

Antes de começar

Leia 2%

Leia 6%

Leia 12%.

Leia 15%

Todos...

A EA diz "Memória insuficiente(4007 Mb usado, 88 Mb disponível, 4095 Mb total)!!!"!

E isto é apenas 15,3% da quantidade necessária (e eu gostaria de aumentá-la também no futuro).


Opção 2 - ler cada vez que o arquivo. Encontre a peça necessária, guarde-a na estrutura, leia a próxima peça, compare o resultado, sobrescreva a estrutura.

E se eu tivesse que passar por estas seqüências uma vez, seria o que eu faria. Mas é preciso passar por elas muitas vezes, avançando um pouco a cada vez.

Portanto, você tem que ler muitas vezes, o que é:

  • muito, muito lento.
  • Limpando um furo no parafuso.
Não sei se estou pronto para esperar alguns dias pelos resultados...

Também é frustrante a quantidade de informação que existe... Se fosse 10 GiG, eu o moveria para o disco RAM (na verdade, para a memória) e leria o máximo que pudesse. Sim?

É tudo o que consigo pensar.

Tente recompilar estas seqüências, para que haja muitas - muitas peças, mas cada uma contendo apenas as informações necessárias no momento?

Tente também comprimir os dados (já converti para flutuadores com tipos de carvão em qualquer lugar que eu possa)? Mas isso me dará no máximo 10%-20% mais e preciso reduzir o volume em uma ordem de grandeza...

Algum conselho, amigos? Eu vou buscá-lo )

 

komposter:

Algum conselho, amigos? Eu cuidarei disso).

Como opções...

1. faça seu próprio cache. Neste caso, você controla o que está na memória. Você conhece o algoritmo, assim você pode fazer o cache eficiente.

2. Use o mapeamento para o arquivo. O vento irá armazenar o que ele precisa e não irá limpar o disco rígido.

 
TheXpert:

Como opções...

1. faça seu próprio cache. Neste caso, você mesmo poderá gerenciar todo o conteúdo.

2. use o mapeamento para o arquivo. vin em si vai armazenar o que ele precisa, de modo que não vai sobrescrever o disco.

1. este é o cache... Ou eu não entendo o que você quer dizer. Minha opção de ler constantemente os pedaços necessários?

2. Você pode elaborar um pouco mais? O que fará o mapeamento e qual a forma de abordá-lo?

 
Estou começando a pegar o jeito do mapeamento. Vou estudar mais mana e depois vou para as minas).
 

Oh, merda...

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

Os mesmos ovos, mas de lado. A leitura pode ser acelerada, mas não resolve o problema globalmente.

 

Outra idéia é mover tudo para um banco de dados (MySQL?) e trabalhar com ele. A idéia é que os bancos de dados sejam projetados para tais volumes e escavação constante.

Existe algum especialista? Quem tem algo a dizer?

 

1) Há alguma maneira de refazer o algoritmo? Para carregar um bloco (2GB), processá-lo, salvar o resultado (mais curto), liberar memória, carregar o próximo bloco ...

e, ao final, processar todos os resultados novamente.

2) Quando há muito trabalho com memória, as soluções baseadas em hash, árvores B (e suas modificações), offload to database são associadas.

 
ALXIMIKS:

1) Há alguma maneira de refazer o algoritmo? Para carregar um bloco (2GB), processá-lo, salvar o resultado (mais curto), liberar memória, carregar o próximo bloco ...

e, ao final, processar todos os resultados novamente.

2) Quando há muito trabalho com memória, soluções baseadas em hash, árvores B (e suas modificações), descarga para o banco de dados são associadas.

1. eu escrevi sobre isso - você pode, mas o problema é que você tem que processar os dados várias vezes. Será muito lento.

2. Amanhã eu mesmo irei ao Google, serei grato por uma breve descrição.

 
komposter:

1. eu escrevi sobre isso - você pode, mas o problema é que você tem que processar os dados várias vezes. Seria muito lento.

2. Amanhã eu mesmo irei ao Google, ficaria grato por uma breve descrição.

Lembrei-me de um site onde um problema semelhante e variantes de sua solução em C++ foram discutidos.

Отсортировать строки в файле размером 3GB | FulcrumWeb
Отсортировать строки в файле размером 3GB | FulcrumWeb
  • www.fulcrumweb.com.ua
Необходимо написать алгоритм, который бы смог отсортировать строки в файле большого размера (от 2-х до 4-х Gigabytes). Результатом выполнения должен быть другой файл. За хорошую реализацию гарантированный приз – флешка для хранения таких файлов и, возможно, предложение работы в нашей компании.
 
Sinto muito, mas e se você tentar 64 bit ou mt só corre 32
Eu achei ingenuamente que uma coisa tão altamente matemática deveria funcionar com 64 bits
Faça cálculos aerodinâmicos para aeronaves, eles não funcionam em 32x
sobre o argumento básico de que 32x é mais rápido para operar a máquina que conheço, mas é realmente um problema de hardware imho
 

1. Naturalmente, use um sistema x64.

2. alugar uma máquina mais potente na nuvem EC2 da Amazônia e fazer os cálculos sobre ela.

3. Usar dados comprimidos, descomprimir na memória em tempo real. Dados reais são melhor comprimidos se você os dividir em fluxos (sinal/mantissa/exponente); você pode usar flutuador de 12 bits (às custas da precisão).

4. fazer um cálculo fora do consultor com algo que possa lidar com grandes dados (Matlab/R/etc).