Sembra che nio .list
restituisca un flusso che, una volta consumato, trattiene un descrittore di file per file iterato, finché .close
non viene richiamato nell'intero flusso. Ciò significa che le directory di dati con un massimo di 1.000 file possono facilmente sfiorare i valori comuni di ulimit
. L'effetto complessivo di questo accumulo di descrittori di file, esacerba ulteriormente quando si ha a che fare con gli attraversamenti nidificati.Iterazione di file in scala/java in O (1) descrittori di file aperti
Quale potrebbe essere un modo alternativo per scorrere i file di directory di grandi dimensioni, oltre a passare alle chiamate di generazione al comando dell'elenco di file del sistema operativo? Sarebbe bello se iterando i file di una directory di grandi dimensioni, un descrittore di file venisse mantenuto solo per il file attualmente iterato, come implicito dalla corretta semantica dello stream.
Edit:
list
restituisce un flusso di java di java.nio.file.Path
Quale chiamata API sarebbe stato utilizzato per la chiusura di ogni voce del flusso una volta che è stato elaborato, piuttosto che solo quando l'intero flusso viene chiuso, per l'iterazione più snella? In scala, questo può essere facilmente manipolato utilizzando il wrapper API da file migliori, che porta da here.
"tiene a uno descrittore di file per file iterati, fino .close si chiama su l'intero flusso "Come sei arrivato a quella conclusione? – Tunaki
Sono arrivato a questa conclusione contando i descrittori di file tramite JMX (Scala 2.11 su Oracle java 8, su Ubuntu), prima e dopo aver iterato il risultato di '.list', con e senza chiamare' close' dopo l'iterazione. – matanster
Aveva lo stesso problema con l'RDD personalizzato in Spark. Aggiunto un elenco di connessioni aperte e un metodo close() per chiudere tutte le connessioni aperte alla fine. Forse potresti modificare il codice iteratore per chiudere un file già in streaming. –