Я также сталкивался с подобными ошибками при тестировании соединения JDBC Java MongoDB. Я думаю, что хорошо подвести итог моему окончательному решению коротким, чтобы в будущем кто-то мог напрямую изучить две команды и хорошо продолжать дальше.
Предположим, вы находитесь в каталоге, где ваш файл Java и внешний (файлы JAR).
Скомпилировать:
javac -cp mongo-java-driver-3.4.1.jar JavaMongoDBConnection.java
Run:
java -cp mongo-java-driver-3.4.1.jar: JavaMongoDBConnection
В конечном итоге это ограничение. Файлы являются прекрасным примером того, что управляется операционной системой, и вам придется проконсультироваться с документацией вашей ОС по конкретному лимиту. В Linux я считаю, что он конфигурируется в ядре. Там могут быть квоты для пользователей и процессов.
Я не думаю, что 200 слишком много, чтобы спросить.
Проще попробовать и посмотреть.
В Mac OS X 10.8 эта программа
#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>
int main() {
int i = 0;
std::ofstream *f;
do {
f = new std::ofstream( std::to_string( i ++ ) );
} while ( * f << "hello" << std::flush );
-- i; // Don't count last iteration, which failed to open anything.
std::cout << i << '\n';
}
Производит вывод 253
. Итак, если вы на Mac, вы золотой :).
Стандарт C ++ не определяет предел для того, сколько (или как мало, я считаю, но я не смотрел) файлов, которые вы можете открыть одновременно.
У конкретной реализации библиотеки C ++ может быть ограничение (которое может быть или не быть документировано). У операционной системы, скорее всего, будет определенный предел для всей системы и еще один предел для каждого процесса. Какие эти ограничения будут варьироваться, поэтому нет простого способа рассказать. И они также могут быть искусственно опущены различными настройками, которые конфигурирует владелец системы.
И даже если вы знаете, что представляют собой все эти ограничения, могут быть динамические ограничения, которые могут варьироваться в зависимости от обстоятельств - например, если вся система разрешает открывать 16384 файлов, для каждого предела процесса 1000 и библиотека C ++ позволяет 1024, вы не сможете открыть один файл, поскольку для ОС не существует свободной памяти для выделения некоторого критического блока данных.
2^(8*sizeof(filehandle))
отдельные файлы. filehandle - это тип, используемый для доступа к содержимому файла. HANDLE, FILE *, int и т. Д. Зависит от операционной системы. Нет ограничений для потоков, которые вы можете открыть одновременно, однако os ограничивает количество файлов, которые можно открыть одновременно. Хотя некоторые сотни файлов, похоже, не слишком много для общего ОС, я бы посоветовал вам заранее прочитать всю информацию (возможно, одновременно открывая несколько файлов, но, учитывая возможность вызова «открыть» для отказа, в этом случае вам следует попробовать еще раз после закрытия некоторых ранее открытых файлов), затем выполнить обработку и сохранить результаты в некоторой внутренней структуре данных. Наконец, вы можете снова записать результаты в файлы, параллельно, но, опять же, быть готовыми к неудачной попытке открыть файл.