Sto utilizzando C# per leggere un file CSV in formato semplice da 120 MB. Inizialmente ho fatto il parsing leggendolo riga per riga, ma di recente ho deciso che leggere prima l'intero contenuto del file in memoria era più volte più veloce. L'analisi è già abbastanza lenta perché il CSV contiene virgole racchiuse tra virgolette, il che significa che devo usare una divisione regolare. Questo è l'unico che ho trovato che funziona in modo affidabile:. NET System.OutOfMemoryException su String.Split() di file CSV da 120 MB
string[] fields = Regex.Split(line,
@",(?!(?<=(?:^|,)\s*\x22(?:[^\x22]|\x22\x22|\\\x22)*,)
(?:[^\x22]|\x22\x22|\\\x22)*\x22\s*(?:,|$))");
// from http://regexlib.com/REDetails.aspx?regexp_id=621
Per fare il parsing dopo aver letto l'intero contenuto nella memoria, faccio una spaccatura corda sul carattere di nuova riga per ottenere un array che contiene ogni riga. Tuttavia, quando lo faccio sul file di 120 MB, ottengo un System.OutOfMemoryException
. Perché esaurisce la memoria così rapidamente quando il mio computer ha 4 GB di RAM? C'è un modo migliore per analizzare rapidamente un CSV complicato?
stringhe sono il figlio bastardo dell'informatica. un male necessario, ma vorrei ancora che qualcuno potesse capire un modo migliore! –