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

 
komposter:

...

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

Caberá uma seqüência na memória?

Você pode escrever um consultor especializado. No início, o Expert Advisor carrega a seqüência # (parâmetro na janela de propriedades) e negocia sobre esta seqüência. Otimizar №.

A tarefa não é muito clara, enquanto muitas coisas diferentes podem ser implementadas.

 
Integer:

Caberá uma seqüência na memória?

Você pode escrever um consultor especializado. O Expert Advisor carrega a seqüência No. na inicialização (parâmetro na janela de propriedades) e negocia nesta seqüência. Otimizar №.

A tarefa não é muito clara, enquanto muitas coisas diferentes podem ser fanáticas.

Se tivermos 20Gb (21 474 836 480 bytes), com 1 milhão de seqüências, obtemos em média 21 475 bytes por seqüência (~21Kb). Acho que deve caber na memória, mesmo no telefone ))

О. A propósito, e a computação distribuída? Devemos pensar também nessa direção...

 
Acho que ele tem os arquivos de histórico a partir dos sinais).
 

Desculpe novamente pela pausa, tenho feito experiências com a unidade RAM (até agora sem muito sucesso). Respondendo a todos em ordem.

Candid:

Mas as seqüências são independentes uma da outra, certo? Então por que não posso passar as datas em uma seqüência de carga única de uma só 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.

É claro que 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, é claro, isto é subjetivo.

Independente. E como entrar em um loop em todas as seqüências ao mesmo tempo, sem carregá-las na memória?

O número de etapas pode ser reduzido, se você descobrir como ler as seqüências a partir do lugar certo (os últimos X negócios a partir da data atual analisada).

Urain:
Toda a base cabe em linhas de 10 anos ou não? todos os arquivos cumulativamente

Um arquivo por milhão de sequências (escrevo cada uma em 9 linhas por conveniência).

Bem, ou um milhão de arquivos, isso não importa.

ALXIMIKS:

Eu entendi corretamente o seguinte:

1) Um arquivo de 20gb consiste em cerca de um milhão de seqüências ordenadas por tempo

2) O tamanho de cada seqüência pode variar e depende do número de negociações que a seqüência contém

3) O tamanho médio de uma sequência é 20/10^6 = 20 Mb, então o que podemos garantir para baixar completamente uma sequência?

4) O coeficiente K depende apenas dos negócios dentro da seqüência dada

5) Para cada seqüência, devemos encontrar K (um total de 10^6 peças) e selecionar as 10 melhores

  1. Sim
  2. Sim
  3. 20K, podemos garantir
  4. Sim, uma execução utiliza um critério com configurações fixas. Mas no futuro eu gostaria que as próximas corridas (com um critério modificado ou outros ajustes) fossem contadas rapidamente também.
    Até que eu tive tais volumes, eu simplesmente baixei tudo para a memória e corri em um loop, contando tudo o que eu precisava.
  5. O valor do Critério é calculado para cada transação da seqüência, a partir da transação #X (este é o montante necessário para o cálculo).
    A melhor seqüência deve ser selecionada em cada ponto da história (a melhor - seqüência com o melhor Critério no momento atual, o Critério é calculado utilizando a última transação fechada.

ALXIMIKS:

A se criarmos outro arquivo com valores de distâncias entre seqüências.

Eu não entendi isto e o próximo.

Candidato:
A propósito, sim, você pode carregar lotes de sequências de uma só vez.

Não vai economizar, você precisa de todos eles.

Silencioso:

Eu não entendo isso em algum lugar.

Aqui está o critério - todos - no intervalo de Data1 a Data2.

Ou seja, a leitura é a seguinte.

Por que não quebrar o arquivo em muitos intervalos de Data1 a Data2? Haverá seqüências de trabalho que podem ser fechadas, certo?

O intervalo "Data1 - Data2" cobre atualmente todas as transações de todas as seqüências.

E a idéia de dividi-la em várias menores é bastante sensata. É verdade, então você teria que ler as informações do disco toda vez que os parâmetros fossem alterados... Mas isso é alguma coisa.

Candidato:
Aparentemente, um dos resultados de um único passe de data é uma nova data.

Sim, mas acho que você pode encontrar um ponto em que não há acordos para nenhuma das seqüências e fazer uma pausa.

Em seguida, haverá uma transição para o próximo intervalo. Vou tentar.

 
ALXIMIKS:

se o problema for este:

dada uma linha 1 2 3 4 5 6 7 8 9

A largura é dada, por exemplo 4, você precisa se mover com esta largura ao longo de toda a linha para encontrar algum valor dentro da largura (por exemplo, mínimo):

primeiro você tem que encontrar em 1 2 3 4 depois 2 3 4 5 depois 3 4 5 6 depois 4 5 6 7 depois .... etc.

Se X (número de negócios) fossem fixos (4 no seu exemplo) e não houvesse outros parâmetros - sim. E assim - não.

Vinina:
Eu ponderaria esta tarefa

As condições são apresentadas acima, bem-vindas para se juntar a nossas fileiras ;)

marketeer:
Como o problema é bastante acadêmico (como uma pergunta para contratar um programador) e muitas pessoas mostraram interesse nele, por que não formulá-lo de forma mais rigorosa em termos de formato de descrição dos dados de entrada, e todos poderiam gerar 20 Gigs de dados de teste e apresentar sua solução prática?

Não há problema.

Gerar seqüências de negócios aleatórios (em ordem cronológica, até mesmo 1 ano) com todos os seus atributos: data e hora de abertura, preço de abertura, SL, TP, data e hora de fechamento, preço de fechamento. Numere as seqüências de 1 a um milhão.

A tarefa é criar uma nova série de ofícios consecutivos a partir de todos os ofícios de todas as seqüências (não sobrepostos no tempo), e selecionados por um determinado critério.

Que o critério seja o lucro médio dos últimos 20 negócios da seqüência.

Exemplo de resultado:

  1. Sequência #250, comércio #53, critério = 51: 2013.01.31 00:00 - 2013.02.12 12:30 (o critério foi calculado para os negócios #32-52, ou seja, o 53º não foi utilizado)
  2. seqüência #1222, transação #28, critério = 75: 2013.02.13 10:00 - 2013.02.13 02:21
  3. E assim por diante até o final do ano.

joo:
Então eu presumo que estamos falando de um testador/optimista caseiro?

Sim, algo parecido com isso.

sergeev:

nah, há algo diferente aí.

Acho que algum corretor/fornecedor tem o banco de dados do negócio. :)

Se apenas =)

sergeev:

Vou repetir a tarefa em termos mais simples.

Não, não é. Dei um exemplo concreto, ele pode ser considerado o mais próximo possível do problema real.

 
elugovoy:

Típico do banco de dados. Mas não há como fazer isso sem agregação de dados. Você pode escrever em uma tabela separada os atributos únicos de uma seqüência (c-datas), o valor médio de lucro K e a variância D, e então procurar as 10 principais seqüências que estão próximas aos critérios que você precisa. Com índices nestes campos, a busca não levará tanto tempo (mesmo em um milhão de registros). Então, quando você obtém as 10 seqüências corretas, você pode pesquisar nos dados brutos, mas não será mais um milhão de buscas, pois temos um limite de datas.

Se o Critério fosse estático...

E se seus parâmetros mudarem?

elugovoy:

Ainda é um mistério - o que devemos procurar? O que deve ser o resultado de todas as operações? Se estamos falando de tomar uma decisão em termos de abertura/fecho de um pedido, qualquer processamento de tal volume levará um tempo bastante grande.

Sim, então haverá uma troca. Mas o recálculo só será necessário para os dados mais recentes, não precisamos recalcular toda a história.

elugovoy:

Há outro ponto. Já que estamos falando de acordos, talvez haja um sentido de separar os acordos para cada símbolo? E para escrever robôs comerciais similares projetados para EURUSD, USDJPY, etc.

É um instrumento...

elugovoy:

Parece-me que dessa forma você só pode identificar a estratégia que foi usada para comercializar (ou o conjunto de parâmetros do robô) de uma determinada seqüência e mudar para ela em uma determinada situação de mercado.

Exatamente.

 
Integer:

Caberá uma seqüência na memória?

Você pode escrever um consultor especializado. No início, o Expert Advisor carrega a seqüência No. (parâmetro na janela de propriedades) e negocia sobre esta seqüência. Otimizar o número.

Ele o fará.

Mas não precisamos de um único resultado (final), mas em cada momento.

Basicamente, poderíamos usar como parâmetro a nuvem, dando número de seqüência e data, até a qual ler. Mas dificilmente é mais rápido do que o recálculo de um arquivo)

elugovoy:

О. A propósito, e a computação distribuída? Também devemos pensar nessa direção...

O que devemos calcular em paralelo? O valor do critério para diferentes seqüências?

Mas precisamos carregá-los na memória para isso. E não importa se são carregados de um processo (Expert Advisor, terminal) ou de vários processos. Talvez, podemos conseguir 8 (ou 12, 16, 20) em vez de 4 Gb. Mas é preciso "colar" o resultado depois.

 
komposter:

O que devemos contar como paralelo? Qual é o significado do critério para seqüências diferentes?

A idéia é dividir todas as histórias em, digamos, 100 grupos e para cada grupo calcular o conjunto ótimo separadamente.

Então, para cada grupo, deixaríamos apenas aquelas histórias que estão no conjunto ideal do grupo e passaríamos ao próximo passo com um número menor de histórias. Depois, teoricamente, é 100 vezes paralela.

E de memória tudo está bem, o tamanho do grupo pode ser ajustado

 
TheXpert:

A idéia é dividir todas as histórias em, digamos, 100 grupos e para cada grupo calcular o conjunto ótimo separadamente.

Então, para cada grupo, deixe apenas as histórias no conjunto ideal de grupo e prossiga para o próximo passo, com menos histórias. Depois, teoricamente, ele é 100 vezes paralelo.

E de memória tudo está bem, o tamanho do grupo pode ser ajustado

Se você carregar 100 de 100 peças em paralelo, não há memória suficiente =)

E se você carregar sequencialmente (cada vez memorizando uma melhor variante), então onde está o paralelismo? E o arquivo ainda será lido toda vez que você for para a máquina.

Acho que é possível inventar um mecanismo inteligente de carga parcial, mas ele tem que ser inventado.

Por exemplo, na primeira leitura, encontre para cada passagem o último comércio fechado antes da Data de Início, volte atrás e leia X negócios anteriores, lembre-se do ponto no arquivo onde esse comércio termina.

Depois disso, encontrar o primeiro negócio nos resultados e depois trabalhar somente com dados novos: ler o arquivo desde o ponto desejado até a nova data real, e cada vez que houver um turno na matriz (obter matriz de tamanho fixo - elementos X).

Isto resolverá o problema com leitura múltipla (simplesmente não é necessário), e com memória (somente se pudermos acomodar X milhões de transações).

Eu irei nessa direção.

 

A mudança para arquivos binários, a propósito, não deu quase nenhum ganho em tamanho.

O formato de texto que otimizei foi muito compacto: a data foi memorizada uma passagem (abertura da primeira negociação), e todas as outras (abertura e fechamento) foram memorizadas como uma compensação da data anterior; SL, TP e PriceClose também foram memorizadas como uma compensação do preço de abertura.

Quando mudei para o formato binário não fazia sentido nesta otimização - o turno em segundos (uint) ocupa tanto espaço, como a data completa (eu recusei longo, 2030 anos é suficiente para mim), mas ushort não é suficiente (apenas 18 horas de turno máximo). O mesmo com os preços - eu poderia deslocar o offset para o ushort, mas então teria que adicionar cheques para overflow (se, por exemplo, SL = 0), e o ganho seria de apenas 6 bytes em todos os 3 preços. Decidiu não fazer isso.

Mas eu removi um pouco de informação desnecessária, então eu tenho 20% dela. Tamanho projetado do arquivo original (que era de 20Gb) - 7-8Gb, um par de horas será convertido.

Bem, também ganhei tempo de CPU, que foi usada para converter as linhas.

Razão: