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

 
Vladislav Andruschenko:


Eu já me deparei com este problema antes. Eu fiz muitas correções. Eu não me lembro de tudo - foi uma tarefa única,

mas tente ajustarArrayResize(arrRead_01,arrSize); o 3º parâmetro aqui


intreserve_size=0// valor do tamanho da reserva (excesso )


e experimentar.

Obrigado, mas todos os atrasos e consumo de memória, a julgar por minhas experiências, ocorrem na classe para leitura das informações do arquivo. Talvez algo possa ser consertado lá?

 
Eu também gostaria muito de ajuda com a segunda pergunta - a restrição de gravação, alguém já resolveu este problema?
 

A julgar pela velocidade da realocação de memória, as matrizes de cordas são armazenadas como matrizes de objetos, não apontando para eles, daí os freios. Precisamos que os desenvolvedores esclareçam esta questão, a solução depende disso.

Em seguida, o analisador cria uma matriz local de células a partir do fio e depois as copia na memória alocada, o que é uma muleta desnecessária, e uma significativa.

Se como um array de objetos - então, dependendo da freqüência e número de atualizações de células no problema, provavelmente seria mais barato a tempo de não analisar o arquivo no carregamento, e armazenar o arquivo xw como um array de linhas de arquivo e atualizar os dados na hora (ou seja, analisar o string a cada acesso à célula). Em qualquer caso, o analisador precisa ser reescrito, é extremamente ineficiente e não suporta células citadas, sendo apenas adequado para a importação de tabelas numéricas.

 
SeriousRacoon:

A julgar pela velocidade da realocação de memória, as matrizes de cordas são armazenadas como matrizes de objetos, não apontando para eles, daí os freios. Precisamos de desenvolvedores para esclarecer esta questão, a solução depende disso.

Vamos tentar chamar o desenvolvedor,@Renat Fatkhullin- você pode esclarecer a situação?

SeriousRacoon:

Então, o analisador cria um conjunto local de células a partir de um fio e depois as copia para a memória alocada - uma muleta desnecessária, e uma muleta significativa.

Como podemos nos livrar dele?

SeriousRacoon:

Se como conjuntos de objetos, dependendo da freqüência e número de atualizações de células no problema, provavelmente seria mais barato, a tempo, não analisar o arquivo no carregamento e armazenar o arquivo xw como um conjunto de linhas de arquivo e atualizar os dados na mosca (ou seja, analisar cadeia de caracteres em cada acesso à célula). Em qualquer caso, o analisador precisa ser reescrito, é extremamente ineficiente e não suporta células citadas e só é bom para importar tabelas numéricas.

"Conjunto de linhas de arquivo" - o que você quer dizer com isso? Se se trata apenas de criar uma matriz para segurar todas as cordas, então, tanto quanto eu entendo, o comprimento da corda tem um limite de caracteres, não?

A aula de leitura foi escrita por um funcionário da MQ, eu pensei que tudo estava escrito de forma inteligente ali.

Parser lê o texto corretamente, eu não concordo com você aqui - o roteiro previamente anexado o confirma.

 
Aleksey Vyazmikin:

Vamos tentar ligar para o desenvolvedor,@Renat Fatkhullin- você pode esclarecer a situação?

Como você pode se livrar dele?

"Array of file strings" - o que você quer dizer? Se é apenas uma questão de criar uma matriz onde todas as cordas serão escritas, então até onde eu entendo, o comprimento das cordas tem um limite de caracteres, não?

A aula de leitura foi escrita por um funcionário da MQ, eu pensei que tudo estava escrito de forma inteligente ali.

Parser lê corretamente o texto, eu discordo de você - o roteiro previamente anexado o confirma.

Ele lê corretamente os arquivos onde não há cadeias de caracteres citadas, dentro das quais há um caráter delimitador. Tente ler 60;""sample;string"" por ele. A saída deve conter 2 células: [60] e [amostra;string]. Você provavelmente receberá 3 - [60] ["sample;string"]. (HH além disso, o qusv permite cordas hifenizadas :) )

Eu sei como eu me livraria disso em C ou pluses - alocar primeiro uma série de ponteiros de corda e preenchê-la analisando a corda. Não há indicações na mcl, não entendo como abordar esta tarefa. Esperemos que Renat possa esclarecer.

"Um conjunto de cordas de arquivo" - o que você quer dizer com isso? Se se trata apenas de criar uma matriz que contenha todas as cordas, então, tanto quanto eu entendo, o comprimento da corda tem um limite de caracteres, não?

Quero dizer, leia o arquivo linha por linha e armazene cada linha original do arquivo em uma matriz sem analisá-lo. Ao acessar a cadeia de caracteres por formato (linha, coluna), pegue a cadeia de caracteres, analise-a na mosca e dê o valor da coluna, caching parsing resultado ao mesmo tempo.

 

Aqui está outra solução possível. Ao ler um arquivo, faça um analisador - salve para cada linha um array de dois valores inteiros: o índice do caractere que inicia o valor da célula na linha, e o comprimento desse substrato.

Por exemplo:

строка в файле : 54;345;12;12345
индекс символа : 0  3   7  10
длина подстроки: 2  3   2  5

Aqui estão os valores dos índices e comprimentos e guarde-os para uma análise posterior sob demanda.
 
SeriousRacoon:

Ele lê corretamente os arquivos onde não há cadeias de caracteres citadas com um caractere delimitador dentro. Tente ler 60;""sample;string"" com ele. A saída deve ser de 2 células: [60] e [amostra;string]. Você provavelmente receberá 3 - [60] ["sample;string"]. (HH além disso, o qusv permite cordas hifenizadas :) )

Oh, estou vendo, eu não sabia sobre tais sutilezas do padrão CSV. Obrigado por me iluminar sobre as peculiaridades!

SeriousRacoon:

Eu sei como eu me livraria dele em C ou pluses - eu alocaria uma série de ponteiros de corda primeiro e o preencheria, analisando a corda. Não há indicadores na mcl, não entendo como abordar esta tarefa. Esperemos que Renat possa esclarecer.

Esperemos que Renat possa esclarecer.

SeriousRacoon:

Quero dizer, leia o arquivo linha por linha e armazene cada linha original do arquivo em uma matriz sem analisá-lo. Ao acessar a linha por formato (linha, coluna), pegue a linha da linha, analise-a na mosca e retorne o valor da coluna, cachenando o resultado da análise.

Sim, eu acho que seria ótimo a tempo, mesmo que o cache não seja particularmente necessário, eu acho. Você pode ajudar e fazer as edições apropriadas à classe para implementar esta abordagem?

 
SeriousRacoon:

Aqui está outra solução possível. Ao ler um arquivo, faça um analisador - salve para cada linha um array de dois valores inteiros: o índice do caractere que inicia o valor da célula na linha, e o comprimento desse substrato.

Por exemplo:

строка в файле : 54;345;12;12345
индекс символа : 0  3   7  10
длина подстроки: 2  3   2  5

Aqui estão os valores do índice e do comprimento e nós os guardamos para uma análise posterior sob demanda.

Bem, sim, isso é sobre a abordagem que escrevi acima hoje - calcular o que é o que primeiro, e depois preencher a matriz. Mas eu não tenho idéia de como implementá-lo :(

 

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

 
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

Sobre