Создание множества указателей для записи из потока для большого количества файлов в цикле [duplicate]

Я также сталкивался с подобными ошибками при тестировании соединения JDBC Java MongoDB. Я думаю, что хорошо подвести итог моему окончательному решению коротким, чтобы в будущем кто-то мог напрямую изучить две команды и хорошо продолжать дальше.

Предположим, вы находитесь в каталоге, где ваш файл Java и внешний (файлы JAR).

Скомпилировать:

javac -cp mongo-java-driver-3.4.1.jar JavaMongoDBConnection.java
  • -cp - аргумент pathpath; передавать все зависимые JAR-файлы по одному
  • *. java - это файл класса Java, который имеет основной метод. sdsd

Run:

java -cp mongo-java-driver-3.4.1.jar: JavaMongoDBConnection
  • Пожалуйста, наблюдайте за двоеточием (Unix) / запятой (Windows) после того, как все файлы JAR зависимой записи завершатся
  • В конце обратите внимание на имя основного класса без какого-либо расширения (нет .class или .java)
4
задан FThewes 4 July 2013 в 15:47
поделиться

4 ответа

В конечном итоге это ограничение. Файлы являются прекрасным примером того, что управляется операционной системой, и вам придется проконсультироваться с документацией вашей ОС по конкретному лимиту. В 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, вы золотой :).

5
ответ дан Potatoswatter 26 August 2018 в 02:57
поделиться

Стандарт C ++ не определяет предел для того, сколько (или как мало, я считаю, но я не смотрел) файлов, которые вы можете открыть одновременно.

У конкретной реализации библиотеки C ++ может быть ограничение (которое может быть или не быть документировано). У операционной системы, скорее всего, будет определенный предел для всей системы и еще один предел для каждого процесса. Какие эти ограничения будут варьироваться, поэтому нет простого способа рассказать. И они также могут быть искусственно опущены различными настройками, которые конфигурирует владелец системы.

И даже если вы знаете, что представляют собой все эти ограничения, могут быть динамические ограничения, которые могут варьироваться в зависимости от обстоятельств - например, если вся система разрешает открывать 16384 файлов, для каждого предела процесса 1000 и библиотека C ++ позволяет 1024, вы не сможете открыть один файл, поскольку для ОС не существует свободной памяти для выделения некоторого критического блока данных.

1
ответ дан Mats Petersson 26 August 2018 в 02:57
поделиться
  1. Os может наложить ограничение на количество одновременно открытых файлов. Unix-подобные системы (linux, * bsd и т. Д.) Определенно имеют этот предел и настраиваются, окна могут иметь аналогичный настраиваемый предел
  2. . В любой операционной системе вы не сможете открыть больше, чем 2^(8*sizeof(filehandle)) отдельные файлы. filehandle - это тип, используемый для доступа к содержимому файла. HANDLE, FILE *, int и т. Д. Зависит от операционной системы.
  3. В библиотеке времени выполнения Windows C (stdio, которая обеспечивает функцию fprintf и аналогичную функцию) может открыться не более 512 файлов одновременно, это число может быть увеличено до 2048, но не дальше. Посмотрите _setmaxstdio . В результате, если fstream использует cstdio под капотом, тот же предел будет применяться к fstream.
  4. Люди говорят, что на 32 окна xp один процесс не может открыть более 65535 файлов. Однако эта информация является слухом, похоже, не поддерживается документацией msdn. Это означает, что это, вероятно, неверно.
0
ответ дан SigTerm 26 August 2018 в 02:57
поделиться

Нет ограничений для потоков, которые вы можете открыть одновременно, однако os ограничивает количество файлов, которые можно открыть одновременно. Хотя некоторые сотни файлов, похоже, не слишком много для общего ОС, я бы посоветовал вам заранее прочитать всю информацию (возможно, одновременно открывая несколько файлов, но, учитывая возможность вызова «открыть» для отказа, в этом случае вам следует попробовать еще раз после закрытия некоторых ранее открытых файлов), затем выполнить обработку и сохранить результаты в некоторой внутренней структуре данных. Наконец, вы можете снова записать результаты в файлы, параллельно, но, опять же, быть готовыми к неудачной попытке открыть файл.

0
ответ дан Stefano Falasca 26 August 2018 в 02:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: