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

 

Finalmente descobrimos o que é necessário, espero que esta versão seja definitiva.

Como dito Tudo é suficientemente simples para dividir e paralelizar, os principais passos:

1. a. Seria muito útil saber onde o início e o fim de cada seqüência (por causa disso sugeri da última vez que escrevi seus tamanhos em um arquivo separado)

б. Você mesmo pode analisá-los, mas neste caso você terá que voltar ao ler a próxima parte do arquivo do disco para ler a seqüência anterior aparada

Em seguida, considerarei a variante 1.a. Provavelmente, não é ótima, mas gosto mais dela.

2. Sabendo o tamanho das seqüências e o tamanho da memória de uma parte do arquivo (500 mb), podemos calcular o tamanho da parte do arquivo que precisamos baixar.

3. Em paralelo, calculamos coeficientes para as seqüências, pois conhecemos o início e o fim de cada seqüência.

4. O início e o fim de cada seqüência podem ser armazenados na fila multi-tarefa (preenchida durante o cálculo da etapa 2)

5. Resultado do cálculo - estrutura (matriz da estrutura onde tempo e coeficiente + número seqüencial))

6. Quando metade do tamanho inicial da memória alocada (250 mb) é processada, inicia-se o processo de reescrita com a formação da segunda fila com o início e o fim

7. Tendo chegado ao final da primeira linha, lemos da segunda; tendo chegado ao final da segunda linha, lemos da primeira.

8. Você pode simultaneamente calcular coeficientes e ler a partir do arquivo.

9. Mas cada resultado do cálculo dos coeficientes deve ser armazenado, e é melhor fundi-los de uma só vez na resposta:

temos que escrever funções de fusão: duas seqüências de coeficientes em um subresultado, dois subresultados em um subresultado ligeiramente completo

10. O processo de fusão também pode ser feito em paralelo.

11. Quando é o resultado? Quando os tamanhos das seqüências lidas do arquivo adicional estiverem terminados, então duas pilhas ficarão vazias, então o cálculo dos coeficientes estará terminado,

então temos que esperar que o processo de fusão de subresultados termine (também pode ser feito através de fila de segurança de linha)

e finalmente fundir subresultados de diferentes fios - resultado.


Aqui está uma variante com carga máxima de tudo possível, talvez algo melhor - ficarei feliz.

Eu preciso de funções:

formando uma seqüência de coeficientes a partir de uma seqüência de entrada

fusão de duas seqüências de coeficientes em um único subresultado (possível perda de precisão aqui)

fusão de dois sub-resultados em um sub-resultado ligeiramente completo (possível perda de precisão aqui)

 
komposter:

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, encontre o primeiro negócio nos resultados, e depois trabalhe somente com dados novos: leia o arquivo desde o ponto desejado até a nova data real, e cada vez que houver um negócio de turno na matriz (teremos uma matriz de tamanho fixo - elementos X).

Isto resolverá o problema com múltiplas leituras (simplesmente não precisamos disso) e memória (somente se pudermos colocar X milhões de transações).

Sim, isso é o que o algoritmo fará.

  1. Redimensionar toda a gama de acordos para X elementos.
  2. Set SeekDate = StartDate.
  3. Abra o arquivo, comece a ler, preenchendo sequencialmente a série de acordos do primeiro passe.
  4. Se as transações, correspondentes à passagem, tiverem terminado (não há X transações suficientes), defina o valor critério = N/A e passe para a próxima passagem.
  5. Se você chegar ao número de negociação (X+1), volte todas as negociações anteriores (#1 é descartado, #2 torna-se #1, #X+1 torna-se #X).
  6. Se você chegar a uma profissão, cujo horário de abertura >= Procure data (não é adicionado à matriz):
    • Calcular o valor do critério para negócios previamente adicionados #1 - #X
    • memorizar o valor do critério
    • memorizar a posição do ponteiro do arquivo antes do negócio
    • Avançar para a próxima seqüência
  7. Se a última seqüência tiver sido processada:
    • Percorreu o conjunto de seqüências e encontrou o melhor valor de Critério
    • Ir para a posição no arquivo onde se encontra a última troca da melhor seqüência
    • Ler um acordo do arquivo, adicioná-lo à matriz (os acordos anteriores são deslocados)
    • Lembrar a posição do ponteiro do arquivo
    • Escrever o acordo no arquivo de resultados
    • Set SequentialDate = Tempo de fechamento do negócio + 1
    • Continuamos a percorrer as seqüências, com a única condição de que as matrizes já estejam preenchidas, e a leitura continua a partir do ponto memorizado.

Se conseguirmos alocar memória para X milhões de negócios(o tamanho da estrutura é conhecido antecipadamente), então seremos capazes de ler o arquivo uma vez.

Se não, então precisamos acrescentar a leitura dos últimos X acordos a cada retorno ao ponteiro Armazenado. Então, o arquivo será lido várias vezes, mas ainda assim economicamente.

A estrutura da seqüência será fixa: Nos, Trades[X], Critério, Posição FilePointer. Não há nada de desnecessário.

Ainda é preciso codificar =)

 

O que é o resultado mais desejável:

dll ou ainda mql para calcular?

 

Sim, nesta forma a tarefa é paralela - cada vez queo SeekDate muda,você pode executar uma busca simultânea pelo melhor critério em diferentes partes do conjunto de seqüências. Por exemplo, os dividimos em 20 partes e damos a tarefa a 20 Conselheiros Especialistas. E eles devem ler o arquivo, encontrar o negócio e enviar apenas a melhor seqüência (№№, Critério e posição do arquivo).

Muito obrigado a todos vocês!

 
ALXIMIKS:

O que é o resultado mais desejável:

dll ou ainda mql para calcular?

Melhor mql, é claro. E não faz sentido escrever uma dll, você também pode fazer um paralelo na MT.
 

Não estou com o mql há meio ano, posso ser um pouco burro, esclarecer se estou errado:

Открываем файл, начинаем читать, последовательно заполняя массив сделок первого прохода 

você está planejando fazer uma leitura separada do disco para cada passe? 10^6 vezes lido de disco?

Não pode haver um obstáculo na leitura individual em vez de ler um pedaço inteiro ao mesmo tempo? Ou tudo é implementado ao mais alto nível aqui com um sólido amortecedor a mais?

Se chegarmos a um comércio, cujo tempo de abertura é >= SeekDate (não é adicionado à matriz):

  • Set SeekingDate = Tempo de Fechamento do Negócio + 1
  • Continuamos a percorrer as seqüências, com a única advertência de que as matrizes já foram preenchidas, e a leitura continua a partir do ponto armazenado.

Eu não vejo onde a memória está sendo liberada, ela continua se acumulando.

  • Percorrer o conjunto de seqüências e encontrar o melhor valor de Critério

Por que manter todo o conjunto por um critério? Você pode simplesmente compará-los ao calcular um novo critério e manter o critério apropriado.

Se você quiser encontrar 10 melhores critérios, é melhor fazer um conjunto de 10 critérios, preenchê-lo com valores, classificá-lo e depois inserir o próximo critério usando a busca binária.

 
ALXIMIKS:

Você está planejando realizar uma leitura separada do disco para cada passe? Ler 10^6 vezes do disco?

Teremos que ler o arquivo completo de qualquer maneira. Não podemos fazer tudo de uma vez (do começo ao fim), então teremos que ler em pedaços (mas ainda assim acabaremos com o arquivo inteiro).

ALXIMIKS:

Não pode haver um obstáculo na leitura de uma peça de cada vez em vez de ler toda a peça de uma só vez? Ou tudo é implementado ao mais alto nível aqui com um sólido amortecedor a mais?

Um pedaço é lido. O tamanho do pedaço é determinado pelo número de transações antes da Data de Busca, que estavam em uma seqüência particular.

ALXIMIKS:

Eu não vejo onde a memória está sendo liberada, ela continua se acumulando.

A memória é alocada uma vez para uma série de estruturas sequenciais.

A estrutura da seqüência inclui: No., Conjunto de estruturas de todas as transações da seqüência [X], Valor do critério, Posição do Ponteiro do Arquivo.

O próximo passo é apenas o preenchimento dos elementos da estrutura (incluindo as matrizes de negócios). Os negócios na matriz são deslocados, de modo que há sempre apenas X negócios de cada seqüência na memória.

ALXIMIKS:

Se você quiser encontrar 10 melhores critérios, é melhor criar um conjunto de 10 critérios, preenchê-lo com valores, classificá-lo e depois inserir o próximo critério usando a busca binária.

Incluindo para o paralelismo.

Mas eliminar um duplo de uma estrutura que contém uma série de estruturas de negócios não faz diferença dentro da estrutura da tarefa.

 

Compartilhando os resultados de minha pesquisa.

O arquivo de cache binário de 7529 MB lê:

  • Do disco rígido: em 212,3 seg (35,46 MB/seg)
  • De disco RAM: em 88,1 seg (85,46 MB/seg)
É difícil chamar a diferença de cósmica, embora eu tenha o disco rígido mais comum (no entanto, a memória também não é rápida).

Conclusão: a velocidade de leitura de um grande arquivo usando o disco RAM é cerca de 2,5 vezes.

 

Se o arquivo fosse classificado por tempo de negócios não dentro de seqüências, mas globalmente (por todas as seqüências), então o seguinte algoritmo seria possível:

- Calcular o critério para uma profissão, considerá-la um candidato

- Calculamos critérios para os negócios que começam dentro deste acordo, se conseguirmos o melhor, mudamos o candidato, se não o conseguirmos, consideramos o candidato selecionado e iniciamos um novo ciclo a partir da data de seu fechamento.

Também podemos ordenar por tempo próximo - neste caso, começamos do final

É claro que para o cálculo de um critério, o arquivo deve conter o número de seqüência para cada comércio.

A reordenação de tal arquivo provavelmente também não é uma coisa divertida, podemos tentar escrevê-lo "adequadamente" de uma só vez. Isto não é para gerar sequências inteiras uma a uma, mas para gerar uma transação para cada sequência e usar algum cache com inteligência ao escrever. Para alguns algoritmos de geração, é claro, isto pode ser inaceitável.

 
Candid:

Se o arquivo fosse classificado por tempo de negócios não dentro de seqüências, mas globalmente (por todas as seqüências), então tal algoritmo seria possível:

- Calcular o critério para o negócio, considerá-lo um candidato

Suponha que eu grave tal arquivo (apenas convertendo o atual, mesmo que isso leve 15 horas de tempo de computador).

Mas então - sobre o primeiro ponto - há um obstáculo. Como calcular o Critério sobre as últimas X negociações da seqüência, tendo tal arquivo?

Mais uma vez, o critério não pode ser calculado uma vez, seus parâmetros podem mudar.