voracidade da memória MT5 RAM, problemas com a leitura/escrita de arquivos grandes - página 3

 
Vladislav Andruschenko:
oop

Eu posso ver que oop... por que escrever arrays em cordas quando você pode escrevê-los em binário de uma só vez

 
Maxim Dmitrievsky:

Eu posso ver que oop... por que escrever arrays em cordas quando você pode escrevê-los em binário de uma só vez?

Está escrito, o homem as processa em excelência.

 
Sergey Savinkin:

Diz que o homem as processa em Excel.

não diz que

 
Maxim Dmitrievsky:

não diz isso.

O primeiro posto. Se você ler com atenção, este arquivo pode não ter nada a ver com o MT5. Ou tratado de uma maneira específica.

 
Sergey Savinkin:

O primeiro posto. Se você ler atentamente, este arquivo pode não ter nada a ver com o MT5. Ou tratado de uma forma específica.

Então deixe-o determinar de onde ele está tirando

Também pode ser lido como uma matriz, suponho.
 
Aleksey Vyazmikin:

Obrigado pela análise do código.

Estou tendo dificuldade para entender o OOP, então fazer edições é uma tortura para mim. Como entendi, é sobre a classe, que é responsável pela leitura, que ali o arquivo inteiro é dividido em matrizes de string, e só então, se eu quiser, converto estes valores de string para outro tipo e os coloco em matrizes de tipo int no meu script. Se eu entender corretamente, então para acelerar o processo, devo ler o arquivo inteiro e descobrir quantas linhas e colunas existem e quantos símbolos estão em cada célula, e então selecionar imediatamente o tamanho da matriz? Então como fazer isso?

Eu gostaria de entender de onde são retirados 400 megabytes de uma só vez? Eu acertei que a memória é alocada, mas não é apagada/doada que foi alocada antes?

400 Mb são 36 milhões de células com linhas vazias, 12 bytes cada, 12*36=432.

Para saber como fazer melhor, fale-nos sobre o problema que você está resolvendo. Com que freqüência e quanto o arquivo muda, se todos têm que ler dele cada vez, se o número de células não vazias é constante de linha em linha, se todas as células contêm apenas inteiros. Talvez 9 minutos devam ser gastos uma vez por semana e não é muito - então não há necessidade de mudar nada.

Em geral, em termos de "onde ir para ser mais rápido", a direção principal é declarar uma estrutura com 57 campos correspondentes a valores inteiros, e utilizá-la tanto para escrita quanto para leitura (o arquivo é binário). Então, 78 Mb serão lidos mais rápido que um segundo do disco diretamente na memória, sem delimitadores ou representações de cordas. Para fins de depuração, salvar a saída para .csv também. O tamanho do arquivo determinará imediatamente o número de elementos na matriz dessas estruturas.

 
Vladimir:

400 MB são 36 milhões de células com linhas vazias, cada uma com 12 bytes, 12*36=432.

A matemática é clara.

Vladimir:

Para saber como fazer melhor, fale-nos sobre o problema que você está resolvendo. Com que freqüência e quanto o arquivo muda, se tudo precisa ser lido sempre, se o número de células não vazias é constante de linha em linha, se todas as células contêm apenas números inteiros. Talvez 9 minutos devam ser gastos uma vez por semana e não é muito - então não há necessidade de mudar nada.

A tarefa é universal, é ler arquivos em formato CSV, porque este formato é universal para diferentes programas, que atualmente me fornecem dados. Se você se refere especificamente a este script, então sim, você só precisa ler e calcular tudo, porque o Excel trava por causa das fórmulas. As células podem conter números não inteiros (não especificamente neste exemplo). 9 minutos não é muito se for uma vez por semana... Entretanto, entre outras coisas, preciso trabalhar com tal quantidade de dados através do otimizador, passando o arquivo para o lado e lá conduzindo seu processamento com a ajuda de agentes, depois obter o resultado no formato csv (aqui eu posso, é claro, usar outro formato) e conduzir o processamento novamente. É por isso que decidi discutir este problema publicamente, porque quero processar grandes matrizes de dados usando o MT5.

Vladimir:

Em geral, do ponto de vista "onde ir para ser mais rápido" - mainstream: declarar estrutura, 57 campos dos quais correspondem a valores inteiros, e usá-la tanto para escrita quanto para leitura (arquivo é binário). Então, 78 Mb serão lidos mais rápido que um segundo do disco diretamente na memória, sem delimitadores ou representações de cordas. Para fins de depuração, salvar a saída para .csv também. O tamanho do arquivo determinará imediatamente o número de elementos na matriz dessas estruturas.

Não consigo nem imaginar, como isso pode ser feito? Ou é que o arquivo inicial deve ser gerado sob condições especiais? Então talvez você possa fazer um conversor de CSV para o formato binário?

Você também pode olhar para a segunda classe, como ensiná-la a escrever um número ilimitado de colunas?

 
Maxim Dmitrievsky:

WriteArray / Read são rápidos, tamanho máximo de até 300 mb, tudo é muito rápido, não consome RAM

Por que há tanto código de leitura/escrita, tudo é feito em 4 linhas.

Você pode demonstrar como fazer isso?

 
Maxim Dmitrievsky:

então deixe-o determinar de onde ele vem

também pode ser lido como uma matriz, eu acho que

O CSV é um formato de arquivo universal, que é suportado em vários softwares, incluindo o associado ao MO.

Além disso, é um arquivo conveniente para transferir dados entre diferentes programas (scripts/advisors) MT5, e não ocupa muito espaço.

 
Aleksey Vyazmikin:

Você pode demonstrar como fazer isso?

tente ler seu arquivo desta maneira

https://www.mql5.com/ru/docs/files/filereadarray

Eu não tenho tempo para abrir o terminal agora, talvez amanhã)

Документация по MQL5: Файловые операции / FileReadArray
Документация по MQL5: Файловые операции / FileReadArray
  • www.mql5.com
//| Структура для хранения данных о ценах                            | //| Script program start function                                    |