Получаю ошибку нехватки места на диске не смотря на кучу свободного места
У меня есть задача: разбить огромный фал на кучу маленьких (> 10 млн файлов) для дальнейшей обработки. Для простоты и удобства я пишу все фалы в одну папку. В какой-то момент при записи файлов я получаю такую ошибку:
java.nio.file.FileSystemException: /home/my/mydir/workfolder/31551546: No space left on device
at java.base/sun.nio.fs.UnixException.translateToIOException(UnixException.java:100)
at java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:111)
at java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:116)
at java.base/sun.nio.fs.UnixFileSystemProvider.newByteChannel(UnixFileSystemProvider.java:219)
at java.base/java.nio.file.spi.FileSystemProvider.newOutputStream(FileSystemProvider.java:478)
at java.base/java.nio.file.Files.newOutputStream(Files.java:219)
at java.base/java.nio.file.Files.newBufferedWriter(Files.java:2919)
at java.base/java.nio.file.Files.newBufferedWriter(Files.java:2962)
java.io.IOException: Stream closed
at java.base/java.io.BufferedInputStream.getBufIfOpen(BufferedInputStream.java:176)
at java.base/java.io.BufferedInputStream.read1(BufferedInputStream.java:297)
at java.base/java.io.BufferedInputStream.read(BufferedInputStream.java:351)
at java.base/java.io.FilterInputStream.read(FilterInputStream.java:107)
at org.gradle.process.internal.streams.ExecOutputHandleRunner.forwardContent(ExecOutputHandleRunner.java:61)
at org.gradle.process.internal.streams.ExecOutputHandleRunner.run(ExecOutputHandleRunner.java:51)
at org.gradle.internal.operations.CurrentBuildOperationPreservingRunnable.run(CurrentBuildOperationPreservingRunnable.java:42)
at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
at java.base/java.lang.Thread.run(Thread.java:834)
При этом когда я выполняю команду
System.out.println(new File("/home/my/mydir/workfolder").getFreeSpace() / 1024 / 1024 + " mb");
Получаю результат в почти 800gb, а один фал весит меньше килобайта. В чем может быть дело?
Дополнение. Если попробовать зайти руками в папку через консоль и создать файл, например, через vim, то все норм.
Ответы (1 шт):
Учитывайте ещё минимальный размер файла в файловой системе и размер блоков. В итоге, для примера, в FAT32 1 файл размером 1кб будет занимать 4кб пространства.
Так же не стоит в одной папке хранить много файлов (примерно до 10000) иначе скорость доступа к файлам будет падать. Лучше разбить файлы по папкам...