Ho bisogno di aiuto! Non riesco a risolvere il problema, sto incontrando delle limitazioni hardware

 

C'è una grande quantità di informazioni (circa 20 GB in un file di testo).

L'informazione consiste nello stesso tipo di sequenze, circa un milione.

È necessario passare attraverso tutte le sequenzeripetutamente e fare alcuni calcoli.

La prima cosa che mi viene in mente è leggere tutto il contenuto del file, riempire l'array di strutture con esso e lavorare con loro in memoria.

Ma non ha funzionato, con il prossimo ridimensionamento MT giura "Memory handler: cannot allocate 5610000 bytes of memory".

Manager mostra che terminal.exe usa 3,5 GB di memoria (di 16 fisici). Suppongo che questo sia perché il processo può ottenere solo 4GB.

Prima di iniziare

Leggi il 2%

Leggere il 6%

Leggi il 12%.

Leggere il 15%

Tutti...

EA dice "Non c'è abbastanza memoria(4007 Mb usati, 88 Mb disponibili, 4095 Mb totali)!!!".

E questo è solo il 15,3% dell'importo richiesto (e vorrei aumentarlo anche in futuro).


Opzione 2 - leggere ogni volta il file. Trovare il pezzo necessario, salvarlo nella struttura, leggere il pezzo successivo, confrontare il risultato, sovrascrivere la struttura.

E se dovessi passare attraverso queste sequenze una volta sola, è quello che farei. Ma bisogna passarci attraverso molte volte, spostandosi ogni volta un po' in avanti.

Quindi devi leggere molte volte, che è:

  • molto, molto lento.
  • Pulire un buco nella vite.
Non sono sicuro di essere pronto ad aspettare qualche giorno per i risultati...

È anche frustrante quante informazioni ci siano... Se fosse 10 GiG, lo sposterei su RAM-disk (in effetti, in memoria) e leggerei il più possibile. Sì?

È tutto quello che mi viene in mente.

Provate a ricompilare queste sequenze, in modo che ci siano molti-molti pezzi, ma ciascuno contenente solo le informazioni necessarie al momento?

Provare anche a comprimere i dati (ho già convertito in float con tipi di char ovunque posso)? Ma mi darà il 10%-20% in più al massimo, e ho bisogno di ridurre il volume di un ordine di grandezza...

Qualche consiglio, amici? Lo prenderò )

 

komposter:

Qualche consiglio, amici? Me ne occuperò io).

Come opzioni...

1. Creare la propria cache. In questo caso, si controlla ciò che è in memoria. Si conosce l'algoritmo, quindi si può rendere la cache efficiente.

2. Usate la mappatura per il file. Wind metterà in cache ciò di cui ha bisogno e non cancellerà il disco rigido.

 
TheXpert:

Come opzioni...

1. fate la vostra cache. In questo caso, sarete in grado di gestire tutti i contenuti da soli.

2. utilizzare la mappatura per il file. vin stesso memorizzerà nella cache ciò di cui ha bisogno, quindi non sovrascriverà il disco.

1. questa è la cache... O non capisco cosa intendi. La mia opzione di leggere costantemente i pezzi necessari?

2. Puoi spiegarti meglio? Cosa farà la mappatura e in che modo avvicinarsi?

 
Sto iniziando a prendere confidenza con la mappatura. Studierò più mana e poi andrò alle miniere).
 

Oh, merda...

32-битные архитектуры (Intel 386, ARM 9) не могут создавать отображения длиной более 4 Гб

Stesse uova, ma di lato. La lettura potrebbe accelerare, ma non risolve il problema a livello globale.

 

Un'altra idea è quella di spostare tutto in un database (MySQL?) e lavorare con esso. L'idea è che i database sono progettati per tali volumi e per lo scavo costante.

Ci sono degli esperti? Chi ha qualcosa da dire?

 

1) C'è un modo per rifare l'algoritmo? Per caricare un blocco (2GB), elaborarlo, salvare il risultato (più breve), rilasciare la memoria, caricare il blocco successivo...

e alla fine, elaborare di nuovo tutti i risultati.

2) Quando c'è molto lavoro con la memoria, si associano soluzioni basate su hash, B-trees (e le loro modifiche), offload al database.

 
ALXIMIKS:

1) C'è un modo per rifare l'algoritmo? Per caricare un blocco (2GB), elaborarlo, salvare il risultato (più breve), rilasciare la memoria, caricare il blocco successivo...

e alla fine, elaborare di nuovo tutti i risultati.

2) Quando c'è molto lavoro con la memoria, si associano soluzioni basate su hash, B-trees (e le loro modifiche), offloading al database.

1. Ne ho scritto - si può, ma il problema è che bisogna elaborare i dati più volte. Sarà molto lento.

2. Domani mi cercherò su Google, vi sarò grato per una breve descrizione.

 
komposter:

1. Ne ho scritto - si può, ma il problema è che bisogna elaborare i dati più volte. Sarebbe molto lento.

2. Domani mi cerco su Google, sarei grato per una breve descrizione.

Mi sono ricordato di un sito dove si discuteva di un problema simile e di varianti della sua soluzione in C++.

Отсортировать строки в файле размером 3GB | FulcrumWeb
Отсортировать строки в файле размером 3GB | FulcrumWeb
  • www.fulcrumweb.com.ua
Необходимо написать алгоритм, который бы смог отсортировать строки в файле большого размера (от 2-х до 4-х Gigabytes). Результатом выполнения должен быть другой файл. За хорошую реализацию гарантированный приз – флешка для хранения таких файлов и, возможно, предложение работы в нашей компании.
 
Mi dispiace, ma cosa succede se si prova con 64 bit o se mt gira solo a 32
Ho ingenuamente pensato che una cosa così altamente matematica dovesse girare su 64 bit
Prendete i calcoli di aerodinamica per gli aerei, non funzionano affatto su 32x
circa l'argomento di base che 32x è più veloce per eseguire la macchina lo so, ma è davvero un problema di hardware imho
 

1. Naturalmente, usate un sistema x64.

2. affittare una macchina più potente nel cloud Amazon EC2 e fare i calcoli su di essa.

3. usare dati compressi, decomprimere in memoria al volo. I dati reali sono meglio compressi se li si divide in flussi (segno/mantissa/esponente); si possono usare float a 12 bit (a spese della precisione).

4. fare un calcolo fuori dall'advisor con qualcosa che può gestire grandi dati (Matlab/R/etc).

Motivazione: