Errori, bug, domande - pagina 2195

 
Artyom Trishkin:

Saluti da fxsaber:

Possiamo vedere un'immagine - cosa fa (il codice)?

 

Per favore, spiegate perché ArrayResize è molto lento con un compito di riserva?

Script

// Добавление элемента в конец произвольного массива
template <typename T>
void AddElement( T &Array[], const T &Value, const int Reserve = 0 )
{
  const int Size = ::ArraySize(Array);

  ::ArrayResize(Array, Size + 1, Reserve);

  Array[Size] = Value;
}


#define  BENCH(A)                                                              \
{                                                                             \
  const ulong StartTime = GetMicrosecondCount();                              \
  A;                                                                          \
  Print("Time[" + #A + "] = " + (string)(GetMicrosecondCount() - StartTime)); \
}

int Bench( const int Size, const int Reserve )
{
  const MqlTick NullTick = {0};
  MqlTick Ticks[];  
  
  for (int i = 0; i < Size; i++)
    AddElement(Ticks, NullTick, Reserve);
    
  return(ArraySize(Ticks));
}

void OnStart()
{
  BENCH(Bench(1 e7, 1 e5)); // 100 раз выделяется память
  BENCH(Bench(1 e7, 1 e6)); //  10 раз выделяется память
  BENCH(Bench(1 e7, 1 e7)); //   1 раз выделяется память
}


Risultato

Time[Bench(1 e7,1 e5)] = 38199494
Time[Bench(1 e7,1 e6)] = 3867983
Time[Bench(1 e7,1 e7)] = 479303


L'allocazione della memoria per 100 volte (da 5 Mb a 500 Mb) richiede 38 secondi. È normale?

L'applicazione pratica è nei caratteri personalizzati, quando si vuole preparare una cronologia delle zecche prima dell'importazione. Supponiamo che ci siano alcuni file CSV con dati di tick nella memoria locale, e avete bisogno di fare un MqlTick-array di essi. Come farlo in modo ottimale? È impossibile calcolare in anticipo la quantità di tick in questi file.

 
Rashid Umarov:

Possiamo vedere un'immagine - cosa fa (il codice)?

 
fxsaber:

Non è possibile calcolare in anticipo il numero di zecche in questi file.

Dividere la dimensione del file per la dimensione approssimativa di una zecca?

 
Andrey Khatimlianskii:

Dividere la dimensione del file per la dimensione approssimativa di una zecca?

Sfortunatamente, non conosco le dimensioni dei file - ho scompattato il CSV da uno ZIP.

 
Rashid Umarov:

Possiamo vedere un'immagine - cosa fa?

Fare uno screenshot su un periodo di tempo selezionato si è rivelato difficile - forse c'è una soluzione di definizione della larghezza adeguata per catturare le barre sui due intervalli di date inclusi?

 
Aleksey Vyazmikin:

Fare uno screenshot su un periodo di tempo selezionato si è rivelato difficile - c'è una soluzione di definizione della larghezza adeguata per catturare le barre sui due intervalli di date inclusi?

Qual è la difficoltà? Ho fatto 2 screenshot con scale diverse in uno script in modo che lo screenshot mostri 30 barre dalla data specificata.


 
fxsaber:

Purtroppo non conosco le dimensioni dei file - decomprimo il CSV da ZIP.

Dove vanno da ZIP? In un array? A una stringa? Hanno anche una taglia/lunghezza.

 
Alexey Viktorov:

Quali sono le difficoltà? Ecco uno script fatto 2 screenshot con scala diversa in modo che sullo schermo fosse 30 barre dalla data specificata.


Metti lo zoom a zero, anche ora puoi vedere che nel secondo screenshot la barra è già stretta, a differenza del primo.

E cosa sono 30 barre, facciamo 600!
 
Andrey Khatimlianskii:

Dove vanno dalla ZIP? In un array? A una stringa? Hanno anche una taglia/lunghezza.

Poi dovrei decomprimere tutto e tenere in memoria centinaia di megabyte di roba scompattata.

Oppure decomprimere sommando il numero di stringhe (stringa - tick). Risparmio di memoria. E poi decomprimere di nuovo, ma con il parsing.