voracità della memoria RAM di MT5, problemi con la lettura/scrittura di file di grandi dimensioni - pagina 2

 
Vladislav Andruschenko:


Ho già incontrato questo problema. Ho fatto molte correzioni. Non ricordo tutto - è stato un compito unico,

ma prova a impostareArrayResize(arrRead_01,arrSize); il 3° parametro qui


intreserve_size=0// valore della dimensione della riserva (in eccesso )


e sperimentare.

Grazie, ma tutti i ritardi e il consumo di memoria, a giudicare dai miei esperimenti, si verificano nella classe di lettura delle informazioni dal file. Forse qualcosa può essere regolato lì?

 
Mi piacerebbe molto anche aiutare con la seconda domanda - la restrizione di registrazione, qualcuno ha risolto questo problema?
 

A giudicare dalla velocità di riallocazione della memoria, gli array di stringhe sono memorizzati come array di oggetti, non puntatori ad essi, da qui i freni. Abbiamo bisogno che gli sviluppatori chiariscano questo problema, la soluzione dipende da questo.

Poi, il parser crea un array locale di celle dalla stringa e poi le copia nella memoria allocata, che è una stampella inutile, e significativa.

Se come un array di oggetti - allora, a seconda della frequenza e del numero di aggiornamenti delle celle nel problema, probabilmente sarebbe più conveniente in termini di tempo non analizzare il file al caricamento, e memorizzare xw-file come un array di righe di file e aggiornare i dati al volo (cioè, analizzare la stringa ad ogni accesso alla cella). In ogni caso, il parser deve essere riscritto, è estremamente inefficiente e non supporta le celle quotate ed è adatto solo per importare tabelle numeriche.

 
SeriousRacoon:

A giudicare dalla velocità di riallocazione della memoria, gli array di stringhe sono memorizzati come array di oggetti, non puntatori ad essi, da qui i freni. Abbiamo bisogno di sviluppatori per chiarire questa domanda, la soluzione dipende da questo.

Proviamo a chiamare lo sviluppatore,@Renat Fatkhullin- puoi chiarire la situazione?

SeriousRacoon:

Quindi, il parser crea un array locale di celle da una stringa e poi le copia nella memoria allocata - una stampella inutile, e significativa.

Come possiamo liberarcene?

SeriousRacoon:

Se come array di oggetti, a seconda della frequenza e del numero di aggiornamenti delle celle nel problema, probabilmente, sarebbe più economico in termini di tempo non analizzare il file al caricamento, e memorizzare xw-file come array di righe di file e aggiornare i dati al volo (cioè analizzare la stringa ad ogni accesso alla cella). In ogni caso, il parser deve essere riscritto, è estremamente inefficiente e non supporta le celle quotate ed è buono solo per importare tabelle numeriche.

"Array of file lines" - cosa intendete con questo? Se si tratta solo di creare un array per contenere tutte le stringhe, allora, per quanto ho capito, la lunghezza della stringa ha un limite di caratteri, no?

Il corso di lettura è stato scritto da un dipendente della MQ, ho pensato che fosse tutto scritto in modo intelligente.

Il parser legge il testo correttamente, non sono d'accordo con te qui - lo script precedentemente allegato lo conferma.

 
Aleksey Vyazmikin:

Proviamo a chiamare lo sviluppatore,@Renat Fatkhullin- puoi chiarire la situazione?

Come ci si può liberare?

"Array of file strings" - che cosa intendi? Se si tratta solo di creare un array che conterrà tutte le stringhe, allora, per quanto ho capito, la lunghezza della stringa ha dei limiti sul numero di caratteri, no?

Il corso di lettura è stato scritto da un dipendente della MQ, ho pensato che fosse tutto scritto in modo intelligente.

Il parser legge correttamente il testo, non sono d'accordo con te - lo script precedentemente allegato lo conferma.

Legge correttamente i file dove non ci sono stringhe quotate, all'interno delle quali c'è un carattere delimitatore. Provate a leggere 60;""campione; stringa"" da esso. L'output dovrebbe contenere 2 celle: [60] e [sample;string]. Probabilmente otterrete 3 - [60] ["sample;string"]. (HH inoltre, qusv permette stringhe sillabate :) )

So come mi sbarazzerei di questo in C o plus: allocare prima un array di puntatori a stringa e riempirlo analizzando la stringa. Non ci sono puntatori in mcl, non capisco come affrontare questo compito. Speriamo che Renat possa chiarire.

"Un array di stringhe di file" - cosa intendete con questo? Se si tratta solo di creare un array che conterrà tutte le stringhe, allora, per quanto ho capito, la lunghezza della stringa ha un limite di caratteri, no?

Voglio dire, leggere il file riga per riga e memorizzare ogni riga originale del file in un array senza analizzarlo. Quando si accede alla stringa per formato (riga, colonna), si prende la riga della stringa, la si analizza al volo e si restituisce il valore della colonna, memorizzando nella cache il risultato dell'analisi allo stesso tempo.

 

Ecco un'altra possibile soluzione. Quando leggete un file, fate un parsing - salvate per ogni riga un array di due valori interi: l'indice del carattere che inizia il valore della cella nella riga, e la lunghezza di quella sottostringa.

Per esempio:

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

Ecco i valori degli indici e delle lunghezze e salvarli per un ulteriore parsing su richiesta.
 
SeriousRacoon:

Legge correttamente i file dove non ci sono stringhe quotate con un carattere delimitatore all'interno. Provate a leggere 60;""campione; stringa"" con esso. L'output dovrebbe essere di 2 celle: [60] e [sample;string]. Probabilmente otterrete 3 - [60] ["sample;string"]. (HH inoltre, qusv permette stringhe sillabate :) )

Oh, capisco, non sapevo di queste sottigliezze dello standard CSV. Grazie per avermi illuminato sulle peculiarità!

SeriousRacoon:

So come me ne sbarazzerei in C o plus - alloco prima un array di puntatori a stringa e lo riempio, analizzando la stringa. Non ci sono puntatori in mcl, non capisco come affrontare questo compito. Speriamo che Renat possa chiarire.

Speriamo che Renat possa chiarire.

SeriousRacoon:

Voglio dire, leggere il file riga per riga e memorizzare ogni riga originale del file in un array senza analizzarlo. Quando si accede alla stringa per formato (riga, colonna), prendere la stringa riga, analizzarla al volo e restituire il valore della colonna, memorizzando nella cache il risultato dell'analisi.

Sì, penso che sarebbe ottimale nel tempo, anche la cache non è veramente necessaria, credo. Puoi aiutare e fare modifiche appropriate alla classe per implementare questo approccio?

 
SeriousRacoon:

Ecco un'altra possibile soluzione. Quando leggete un file, fate un parsing - salvate per ogni riga un array di due valori interi: l'indice del carattere che inizia il valore della cella nella riga, e la lunghezza di quella sottostringa.

Per esempio:

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

Qui ci sono i valori di indice e lunghezza e li salviamo per un ulteriore parsing su richiesta.

Beh, sì, questo è più o meno l'approccio di cui ho scritto sopra oggi - calcolare prima cosa è cosa, e poi riempire l'array. Ma non ho idea di come implementarlo :(

 

WriteArray / Read sono veloci, dimensione massima fino a 300 mb, tutto è molto veloce, non consuma RAM

Perché c'è così tanto codice per la lettura/scrittura, è tutto fatto in 4 righe

 
Maxim Dmitrievsky:

WriteArray / Read sono veloci, dimensione massima fino a 300 mb, tutto è molto veloce, non consuma RAM

Perché c'è così tanto codice per la lettura/scrittura, è tutto fatto in 4 righe

Informazioni su