voracidade da memória MT5 RAM, problemas com a leitura/escrita de arquivos grandes - página 6
![MQL5 - Linguagem para estratégias de negociação inseridas no terminal do cliente MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Você está perdendo oportunidades de negociação:
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Registro
Login
Você concorda com a política do site e com os termos de uso
Se você não tem uma conta, por favor registre-se
Recomendo fazer uma mudança mínima primeiro, para que a realocação de memória seja feita com menos freqüência. Duas linhas
m_total_rows++;
ArrayResize(m_células,m_total_linhas*m_total_colunas,10000);
em bool CSVReader::AdicionarData(string data_str,bool header) substituir por
m_total_rows++;
se (m_total_linhas*m_total_colunas>ArraySize(m_cells)) ArrayResize(m_células,2*m_total_linhas*m_total_colunas);
O número de realocações de memória com cópia deve se tornar O(log(n,2)) em vez de O(n). 20 ao invés de 600 mil. Talvez isso seja suficiente para você agora.
Obrigado! Quero que você saiba o que eu tenho:
1. Nenhuma mudança na memória - por 10 gigabytes o código atual comia RAM ali e ali.
2. Por velocidade:
2.1 Versão antiga 574 segundos
2.2 Nova versão: 138 segundos.
Assim você obtém um ganho de 4 vezes, o que é muito bom! Entretanto, a memória é apertada, e isto está longe de ser tudo o que precisa ser carregado....
muito útil :)
Assim, converti o CSV em binário, menos a data.
O que acontece é que, ao executar o roteiro, foi preciso 1 gigabyte de memória, o que, comparado a 10, é muito bom. No entanto, ainda muito :)
Em termos de velocidade - apenas 16 segundos! Muito bom!
Recomendo fazer uma mudança mínima primeiro, para que a realocação de memória seja feita com menos freqüência. Duas linhas
m_total_linhas++;
ArrayResize(m_células,m_total_linhas*m_total_colunas,10000);
em bool CSVReader::AdicionarData(string data_str,bool header) substituir por
m_total_linhas++;
if (m_total_linhas*m_total_colunas>ArraySize(m_cells)) ArrayResize(m_células,2*m_total_linhas*m_total_colunas);
O número de realocações de memória com cópia deve se tornar O(log(n,2)) em vez de O(n). 20 ao invés de 600 mil. Talvez isso seja suficiente para você.
Na verdade, o terceiro parâmetro para ArrayResize() é especificado por uma razão... É uma má mudança.
Leia a documentação
Na verdade, o terceiro parâmetro para ArrayResize() é especificado por uma razão... uma mudança de penas...
Leia a documentação
O que você conseguiu obter da documentação sobre o terceiro parâmetro, útil para este caso, quando resolveu a tarefa de levantar para a memória .csv criada em diferentes programas e com tamanho arbitrário?
Sinta-se livre para sugerir uma mudança melhor, não binária, o que aumenta a velocidade da realocação de memória (reduzindo o número de chamadas ArrayResize) mais do que a busca binária...
Obrigado! Eu o informarei do que vier à tona:
1. Nenhuma mudança na memória - por 10 gigabytes o código atual comia RAM ali e ali.
2. Por velocidade:
2.1 Versão antiga 574 segundos
2.2 Nova versão: 138 segundos.
Assim você obtém um ganho de 4 vezes, o que é muito bom! No entanto, a memória é apertada, e não é muito para carregar....
Após a leitura, em bool CSVReader::Load(int start_line), após a linha
FileClose(filehandle);
inserção livre de memória
ArrayResize(m_células,m_total_linhas*m_total_colunas);
Liberta 0-50% da memória ocupada por m_cells desnecessárias. Somente m_células em si, sem conteúdo celular.
Agora estou fazendo uma pequena biblioteca para o manuseio rápido de CSV.
Na imagem da tela há um teste que é realizado em 7 segundos!!! Processador Xeon, freqüência 3.0.
Primeiro o script compõe o formato de dados para cada coluna. Há 6 colunas. Em seguida, 1000000 linhas são adicionadas à tabela, depois são preenchidas com números de 0 a 999999. De acordo com o formato dos dados, os números podem ser percebidos de forma diferente. Depois, tudo é salvo em um arquivo.
O tamanho do arquivo é 65,4 MB. Toda a estrutura ocupou 232 MB na memória.
Assim, converti o CSV em binário, menos a data.
O que acontece é que, ao executar o roteiro, foi preciso 1 gigabyte de memória, o que, comparado a 10, é muito bom. No entanto, ainda muito :)
Em termos de velocidade - apenas 16 segundos! Muito bom!
Bem, o roteiro em si ainda está aleijado.
Após a leitura, em bool CSVReader::Load(int start_line), depois da linha
FileClose(filehandle);
inserir liberação de memória
ArrayResize(m_células,m_total_linhas*m_total_colunas);
Liberta 0-50% da memória ocupada por m_cells desnecessárias. Somente m_células em si, sem conteúdo celular.
Obrigada, mas depois de fechar o arquivo/acabamento do roteiro, a memória é rapidamente liberada de qualquer forma. Veja aqui como reduzir o consumo enquanto se executa....
Agora estou fazendo uma pequena biblioteca para trabalhar rapidamente com o CSV.
Na imagem da tela há um teste que é realizado em 7 segundos!!! Processador Xeon, freqüência 3.0.
Primeiro o script compõe o formato de dados para cada coluna. Há 6 colunas. Em seguida, 1000000 linhas são adicionadas à tabela, depois são preenchidas com números de 0 a 999999. De acordo com o formato dos dados, os números podem ser percebidos de forma diferente. Depois, tudo é salvo em um arquivo.
O tamanho do arquivo é 65,4 MB. Toda a estrutura ocupou 232 MB na memória.
Muito interessante. Você está planejando publicar publicamente suas realizações de programação?
Bem, o roteiro em si ainda é uma bagunça.
Você pode me dizer o que devo consertar nele?