сохранение состояния программы (Visual Studio 2008)

Я отлаживаю (в 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. Я продолжу расследование.

5
задан ykhrustalev 26 May 2011 в 11:09
поделиться