Должен ли я сначала собрать файлы, а затем выполнить задачу или выполнить задачи во время сбора?) - PullRequest
4 голосов
/ 16 января 2012

Мне нужно просмотреть все файлы данной папки (и ее подпапок) и выполнить что-то для каждого файла.Я искал способ просмотреть все файлы рекурсивно и нашел одно решение в Apache Commons Io: FileUtils.iterateFiles Возвращает итератор.Я проверил, как это реализовано, и увидел, что он просматривает все файлы и добавляет их в коллекцию, а затем возвращает итератор для коллекции.Ну, конечно, это то, что он делает.это то, что я искал:)

Но потом я подумал - эффективно ли сначала собирать все файлы, а затем перебирать все их и выполнять то, что я хочу?Или я должен вместо того, чтобы собирать их, просто выполнить действие в рекурсивном обходе?

Следует отметить, что мои необходимые действия над файлами включают в себя манипуляции с ними над вводом-выводом, которые могут быть неудачными ... (которые могут быть обработаны обоими способами ... но только что замечены, если я что-то упустил в своей строкемысли) Кроме того, набор папок и файлов, которые я просматриваю, МОЖЕТ достигать 400 папок или 5000 файлов или около того, а размеры файлов могут достигать нескольких гигабайт (опять же, не очень актуально при простом просмотре файлов, но актуально, потому что я собираюсь выполнить IOзадачи) ..

Есть мысли?

спасибо.

Ответы [ 3 ]

0 голосов
/ 16 января 2012

Чтение вещей с диска медленное и дорогое. Наилучший подход - использовать многопоточность, чтобы не тратить время на ожидание ввода-вывода, чтобы вернуть содержимое файла. Как только чтение файла отправлено, поток чтения / записи на некоторое время переходит в спящий режим, и другой поток будет обрабатывать то, что вам нужно. когда поток чтения / записи просыпается, он записывает на диск.

Чтобы ответить на ваш вопрос, невозможно загрузить все файлы (и их содержимое) один раз и продолжить их обработку из-за ограничений памяти. Использование многопоточности для обработки нескольких файлов за один раз. или вы можете использовать mapreduce, в зависимости от поставленной задачи

0 голосов
/ 26 января 2012

Это, вероятно, зависит от размера списка.Если нет проблем с сохранением списка в памяти, я бы закончил этот список, прежде чем работать с файлами.Причина проста: с одной стороны, сканирование дерева каталогов обычно происходит быстро из-за организации файловой системы;с другой стороны, вам, вероятно, следует последовательно работать с одним файлом за раз, чтобы повысить производительность (если вы выполняете многозадачность и одновременно работаете со многими файлами, ваш диск будет работать медленнее).

0 голосов
/ 16 января 2012

Вы должны начать навигацию по файловой системе, создать реализацию Runnable / Callable для того, что вы хотели бы делать с этими файлами, и прежде чем каждый найденный файл отправит его в ThreadPool (вы можете создать его из Executors class).

В этом случае вам, вероятно, следует использовать фиксированный пул потоков, а его размер может варьироваться, вы должны сравнить его и посмотреть, как количество потоков, работающих с вашими файлами, влияет на производительность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...