Я отлаживаю (в Visual Studio 2008) утилиту, написанную мной на C ++. FileChannel канал = file.getChannel (); // какой-то код String line = "некоторые данные"; ByteBuffer buf = ...
Привет, у меня есть код, который использует блок
RandomAccessFile file = new RandomAccessFile("some file", "rw");
FileChannel channel = file.getChannel();
// some code
String line = "some data";
ByteBuffer buf = ByteBuffer.wrap(line.getBytes());
channel.write(buf);
channel.close();
file.close();
, но специфика приложения заключается в том, что мне нужно сгенерировать большое количество временных файлов, в среднем более 4000 (используется для вставки Hive в секционированная таблица).
Проблема в том, что иногда я перехватываю исключение
Failed with exception Too many open files
во время работы приложения.
Я удивляюсь, есть ли способ сообщить ОС, что файл уже закрыт и больше не используется, почему
channel.close();
file.close();
не уменьшает количество открытых файлов. Есть ли способ сделать это в коде Java?
Я уже увеличил максимальное количество открытых файлов в
#/etc/sysctl.conf:
kern.maxfiles=204800
kern.maxfilesperproc=200000
kern.ipc.somaxconn=8096
Обновление: Я попытался устранить проблему, поэтому я разделил код, чтобы исследовать каждую его часть (создание файлов, загрузка в куст, удаление файлов).
Использование класса 'File' или 'RandomAccessFile' завершается неудачно с исключением "Слишком много открытых files ».
Наконец, я использовал код:
FileOutputStream s = null;
FileChannel c = null;
try {
s = new FileOutputStream(filePath);
c = s.getChannel();
// do writes
c.write("some data");
c.force(true);
s.getFD().sync();
} catch (IOException e) {
// handle exception
} finally {
if (c != null)
c.close();
if (s != null)
s.close();
}
И это работает с большими объемами файлов (проверено на 20 КБ размером 5 КБ каждый). Сам код не генерирует исключение, как предыдущие два класса. Но производственный код (с ульем) все же был исключением. И похоже, что причиной этого является подключение улья через JDBC. Я продолжу расследование.