Precisa de ajuda! Não consigo resolver o problema, estou atingindo limitações de hardware - página 11

 
elugovoy:

Yurichik, eu quis dizer sem mexer no processamento de arquivos, compressão, etc. Trabalho puramente com SQL e lógica de robô/indicador. Trabalhei com muitos bancos de dados, o único problema era fazer com que MQL e SQL funcionassem juntos)). Criei uma boa solução sem arrays e estruturas.

Em geral, prefiro não reinventar a roda e resolver os problemas pelos melhores meios.

Zhenya sim, eu te peguei ...

É exatamente isso que eu prefiro

... especialmente se uma ferramenta profissional estiver disponível... melhor para integrar bem...

 

Que discussão! Obrigado a todos por sua participação!

Vou responder a todos juntos, tentando não perder nada (e ninguém).

1. Перейти на x64

Demorei algum tempo para perceber que não especifiquei a versão terminal. Estou trabalhando com 4, e ainda não vou migrar esta EA para 5. O MT4, infelizmente, é apenas de 32 bits.

A remoção da limitação de memória de 4 GB no Windows 8 / 8.1 de 32 bits não vai ajudar, meu sistema já é x64.

2. Cortar em peças / ler em peças / carregar pequenos blocos

Não vai funcionar para as condições da tarefa.

Tentarei dar mais detalhes a seguir, talvez isso dê uma melhor compreensão do problema.

3. Comprar mais memória / alugar um servidor poderoso ou nuvem / mover tudo para SSD

É claro que colocarei mais 16GB de memória nos slots disponíveis, mas essa não é a resposta.

Esse volume não é o limite e a expansão da capacidade só resolverá um caso especial do problema.

Acho que só se deve recorrer a isto quando se tem certeza de que está 100% algorítmicamente apertado.

4. Comprimir dados

Isso é o que estou fazendo agora.

O cache de texto (que é 20GB) foi comprimido por um fator de 2, e provavelmente será comprimido um pouco mais.
Não resolve o problema do tamanho da memória, mas se aproxima de algumas outras soluções (disco RAM).

Também o converterei em binário, acelerará a leitura e reduzirá o volume.


Não está clarocomo os feiticeiros dehttp://www.nanex.net/historical.htmlcomprimem os dados. Suas estruturas de dados são bastante redundantes.

5. Comprimir/codificar os dados e descomprimir/descomprimir o pedaço desejado antes de usar

Aceito como uma opção.

Mas algo me diz que também vai levar muito tempo (aqui ficaremos atolados pelo processador).

6. Transferência de cálculo para um programa externo(Matlab/R/etc).

Eu não quero, há muitas razões.

A menos que esteja em um ambiente bem integrado com a MT. Mas isso ainda levaria tempo para aprender o software/ambiente e/ou encomendar a solução de um desenvolvedor terceirizado. É inconveniente e caro na fase de desenvolvimento (que eu sou).

De qualquer forma, tentando ficar na caixa de areia por enquanto, com todos os seus prós e contras.


7. Criar arquivo de índice e trabalhar com índices

Não vejo como isto pode ajudar.

Ainda tem que recuperar repetidamente os dados do arquivo principal (constantemente relendo-o).


8. Utilize um banco de dados

Uma opção muito tentadora, dada:

  • escalabilidade e portabilidade (você pode alugar um servidor ou simplesmente conectar um PC vizinho);
  • automação e bom fluxo de trabalho de muitos processos que, de outra forma, teriam de ser feitos manualmente em uma amassada;
  • e outros benefícios.

Mas há algumas desvantagens:

  • Ambiente relativamente novo para mim (não funcionou muito bem, apenas consultas básicas);
  • A complexidade de instalação em uma única máquina cliente (versão autônoma);
  • Provavelmente algo mais.
De qualquer forma, se outras opções não funcionarem, eu provavelmente voltarei a esta.


9. Entender e testar termos novos e obscuros

Isto é apenas uma nota para mim para o futuro e/ou um pedido de mais informações aos autores ;)

Esquerda por descobrir: Mapeamento de arquivos,soluções baseadas em hash, árvores B.


10. Mover terminal com todos os caches para um disco RAM virtual

Até agora, esta é a opção mais promissora (em termos de relação custo/benefício).

Disco RAM do SoftPerfect instalado, vou terminar a compressão do cache, reescrever a calculadora para leitura permanente de arquivos e verificar o desempenho.

11. Faça a tarefa certa =)

Muito bons conselhos, especialmente considerando a escassez de informações de entrada.

Como prometido, vou tentar dar mais detalhes.

Há muitas seqüências de ofícios semelhantes, cada seqüência é ordenada pelo tempo.

Os negócios em seqüências diferentes são diferentes e distribuídos de forma desigual no tempo (e de forma diferente em cada seqüência). O número de acordos é diferente. Mas todos eles estão no intervalo de Data1 a Data2.

A tarefa é passar de D1 para D2 com passo de M minutos (ou melhor - exatamente por pontos de fazer negócios de todas as seqüências), encontrar uma seqüência que seja melhor do que outras pelo critério K (uma tarefa separada - não apenas para encontrar a melhor seqüência, mas para ordenar todo o conjunto pelo critério e sair os 10 primeiros - mas é uma seqüência opcional, ainda não necessária).

O critério K é calculado com base em X operações anteriores da seqüência correspondente, quase todas as informações sobre cada uma das X operações são utilizadas nos cálculos (o lucro sozinho, por exemplo, não é suficiente).


O critério (K), o número de negócios (X) e outros parâmetros que influenciam os resultados são alterados por um usuário. Ou seja, eles não podem ser "escritos" no algoritmo.

Algo parecido com isto.

Na idéia, podemos reestruturar o arquivo para torná-lo linear para todos os ofícios de todas as seqüências.

Mas como isso pode ser feito sem colocar todas as informações na memória? E então como posso recalcular o Critério, se os negócios de uma seqüência serão "manchados" em todo o arquivo?

Agora, esperemos, a tarefa seja clara.

Mais uma vez, muito obrigado por sua participação, discussões, perguntas, links e respostas concretas:

TheXpert,Urain,sergeev,elugovoy,anônimo,carne,ALXIMIKS,IvanIvanov,Integer,C-4,marketeer,barabashkakvn,Silent,GT788,papaklass,grizzly_v,artemiusgreat,YuraZ,Candidato,Contender eservidor

Obrigado!

 
komposter:

Que discussão! Obrigado a todos por sua participação!

....

Uma opção muito tentadora, considerando:

  • Escalabilidade e portabilidade (você pode alugar um servidor ou simplesmente conectar um PC vizinho);
  • automação e bom fluxo de trabalho de muitos processos, que de outra forma têm de ser feitos manualmente aos joelhos;
  • e outros benefícios.

Mas há algumas desvantagens:

  • Ambiente relativamente novo para mim (não funcionou muito bem, apenas consultas básicas);
  • A complexidade de instalação em uma única máquina cliente (versão autônoma);
  • Provavelmente algo mais.
Em geral, se outras opções não funcionarem, eu provavelmente voltarei a esta.


Se formos na direção do SQL


  • Ambiente relativamente novo para mim (não tenho trabalhado de perto, apenas consultas básicas);

Pode ser um grande entrave para a curva de aprendizado.

Se você escolher esta variante, é melhor construir toda a lógica comercial com procedimentos armazenados

deixando o Expert Advisor apenas duas funções - enviar uma solicitação para o servidor e obter um resultado completamente acabado

todos os cálculos no servidor

  • A complexidade da instalação em uma única máquina cliente (versão autônoma);

Na verdade, a rede pode encontrar muitas descrições de como colocar o SQL Server

( ORACL, SYBASE + CENTOS por exemplo ) ORACL, SYBASE, MS SQL+WINDOWS máquina separada

ORACL é um pouco mais difícil de aprender - menos especialistas, menos literatura.

MS SQL - talvez a maior quantidade de informações e mais literatura na web.

não haverá dificuldades - há muitas descrições na web e mais livros na loja.

O MSSQL 2012 por seus parâmetros é muito próximo ao ORACL - já em 2014.

SQL + LINUX é normalmente escolhido para operação em um ambiente de produção - se você não sabe nada sobre LINUX é melhor usar WINDOWS

 

komposter:

Há muitas seqüências de negócios semelhantes, cada seqüência é ordenada por tempo.

As transações em seqüências diferentes são diferentes, distribuídas desigualmente no tempo (e de forma diferente em cada seqüência). O número de acordos é diferente. Mas todos eles estão no intervalo de Data1 a Data2.

A tarefa é passar de D1 para D2 com passo de M minutos (ou melhor - exatamente por pontos de fazer negócios de todas as seqüências), encontrar uma seqüência que seja melhor do que outras pelo critério K (uma tarefa separada - não apenas para encontrar a melhor seqüência, mas para ordenar todo o conjunto pelo critério e sair os 10 primeiros - mas é uma seqüência opcional, ainda não necessária).

O critério K é calculado com base em X operações anteriores da seqüência correspondente, quase todas as informações sobre cada uma das X operações são utilizadas nos cálculos (o lucro sozinho, por exemplo, não é suficiente).


O critério (K), o número de negócios (X) e outros parâmetros que influenciam os resultados são alterados por um usuário. Ou seja, eles não podem ser "escritos" no algoritmo.

Algo parecido com isto.

Na idéia, podemos reestruturar o arquivo para torná-lo linear para todos os ofícios de todas as seqüências.

Mas como isso pode ser feito sem colocar todas as informações na memória? E então como posso recalcular o Critério, se os negócios de uma seqüência serão "manchados" em todo o arquivo?

Agora, espero, a tarefa é clara.

Tradicionalmente, estou diminuindo a velocidade pela manhã :).

Uma seqüência caberá na memória ou já existe um problema com ela?

Se o primeiro, quando ocorrem múltiplas leituras do disco, quando o usuário muda os critérios e parâmetros?

Em caso afirmativo, a mudança é feita por algum algoritmo ou manualmente com base em algum motivo subjetivo?

 
Candid:

Tradicionalmente, estou diminuindo a velocidade pela manhã :).

Uma seqüência caberá na memória ou já existe um problema com isso?

Se o primeiro, quando ocorrem múltiplas leituras do disco, quando o usuário muda os critérios e parâmetros?

Em caso afirmativo, a mudança é feita por algum algoritmo ou manualmente com base em algum motivo subjetivo?

Um milhão de seqüências.

E então, em cada um deles é encontrado um ponto com a data certa e a história anterior é analisada.

E a melhor das seqüências é escolhida.

E passa para o próximo ponto da "história".

 
Eu acho que se você não quiser incomodar os usuários finais com a instalação do SGBD, então há uma opção para sintetizar vários (uma dúzia) critérios K típicos (por exemplo, chamá-los de negociação conservadora, negociação agressiva, etc.) e realmente colocá-los no algoritmo, calcular de uma vez por todas as seqüências a mudança do indicador selecionado no tempo e depois trabalhar com vetores unidimensionais.
 
marketeer:
Eu acho que se você não quiser incomodar os usuários finais com a instalação do SGBD, você pode sintetizar vários (uma dúzia) critérios K típicos (por exemplo, chamá-los de negociação conservadora, negociação agressiva, etc.) e realmente salvá-los no algoritmo, calcular de uma vez por todas as seqüências a mudança do indicador selecionado no tempo e depois trabalhar com vetores unidimensionais.

Digamos que existem apenas 2 critérios.

Mas há vários parâmetros que estabelecem o critério, e cada um pode ter um valor diferente.

Mesmo que tomemos vários valores aproximados de cada parâmetro, obteremos não um vetor unidimensional, mas uma matriz tridimensional ou quadridimensional.

Então não há memória suficiente para ter certeza =)

 
komposter:

Um milhão de seqüências.

E então, em cada um deles é encontrado um ponto com a data certa e a história anterior é analisada.

E a melhor das seqüências é escolhida.

E passa para o próximo ponto da "história".

A seqüência inteira é carregada na memória. Depois "encontra o ponto com a data desejada e analisa o histórico anterior". O valor do critério é comparado com o melhor alcançado. Se melhor, o critério e o que saber sobre a melhor seqüência é lembrado. Em seguida, a seqüência seguinte é carregada no lugar da seqüência processada. E assim por diante um milhão de vezes.

O arquivo é lido sequencialmente e apenas uma vez.

O que está errado?

 
Candid:

A seqüência inteira é carregada na memória. Em seguida, ele "encontra o ponto com a data certa e analisa a história anterior". O valor do critério é comparado com o melhor alcançado. Se melhor, o critério e o que saber sobre a melhor seqüência é lembrado. Em seguida, a seqüência seguinte é carregada no lugar da seqüência processada. E assim por diante um milhão de vezes.

O arquivo é lido sequencialmente e apenas uma vez.

O que está errado?

É isso mesmo.

E então a "data certa" é deslocada pelo ponto de fechamento do negócio da seqüência selecionada e o algoritmo se repete.

E assim por diante mais um milhão de vezes =)

 
komposter:

É assim.

E então a "data certa" é deslocada pelo ponto de fechamento do comércio da seqüência escolhida e o algoritmo é repetido.

E assim por diante mais um milhão de vezes =)

Mas as seqüências são independentes uma da outra, certo? Então por que não podemos fazer um ciclo de datas em uma seqüência carregada de cada vez? Aqui, a propósito, pode ser apenas uma oportunidade de ir a algum algoritmo de recorrência eficiente, mas isso é o que a sorte teria. O tamanho de um milhão sobre um milhão permanecerá, e o arquivo será lido uma vez.

Naturalmente, um problema onde o número de passos permanece o mesmo na próxima iteração (ou seja, a área de busca não fica mais estreita à medida que o cálculo prossegue) não parece muito robusto. Mas isto é subjetivo, é claro.