Ho un lavoro in esecuzione sulla produzione che elabora i file xml. I file xml hanno un valore di circa 4k e di dimensione compresa tra 8 e 9 GB.Errno :: ENOMEM: Impossibile allocare memoria - cat
Dopo l'elaborazione otteniamo i file CSV come output. Ho un comando cat che unire tutti i file CSV in un singolo file sto ottenendo:
Errno :: ENOMEM: Impossibile allocare memoria
a comando cat
(backtick).
Qui di seguito sono alcuni dettagli:
- memoria di sistema - 4 GB
- Swap - 2 GB
- Rubino: 1.9.3p286
file vengono elaborati utilizzando nokogiri
e saxbuilder-0.0.8
.
Qui c'è un blocco di codice che elabora 4.000 file XML e l'output è salvato in CSV (1 per xml) (scusate, non credo di condividerlo con la politica aziendale).
Di seguito è il codice che unire i file di output in un unico file
Dir["#{processing_directory}/*.csv"].sort_by {|file| [file.count("/"), file]}.each {|file|
`cat #{file} >> #{final_output_file}`
}
ho preso istantanee di consumo di memoria durante processing.It consuma quasi tutti parte della memoria, ma, non lo farà fallire. Comincia sempre con il comando cat
.
Suppongo che, con il backtick, provi a eseguire il fork di un nuovo processo che non ha memoria sufficiente, in modo da non riuscire.
Per favore fatemi sapere la vostra opinione e alternativa a questo.
IMO che sarebbe senso di mostrare in realtà quello che stai facendo. –
@DaveNewton Ho modificato il mio post, grazie per la tua risposta – Atith
Potresti avere una memoria insufficiente perché ciò accada, sei sicuro di avere abbastanza memoria? Qual è l'output di '' free -m''? – Intrepidd