Вот моя текущая проблема:
У меня есть структура каталогов, хранящаяся где-то в облачном хранилище. В папке Root у меня есть 1000+ подкаталогов, и у каждого из них есть один подкаталог под ними. И внутри каждого из этих подкаталогов существует один файл. Таким образом, упрощенная диаграмма выглядит примерно так:
Root
________________|________________
| | | |
FolderA FolderB ... FolderY FolderZ
| | | |
Folder1 Folder2 Folder3 Folder4
| | | |
FileA FileB FileC FileD
Для каждого узла у него есть свойства type
("каталог" или "файл") и path
("/ Root / FolderB"). И единственный способ получить эти узлы - вызвать метод с именем listDirectory(path)
, который отправляется в облако, получает все объекты в этом path
. Мне нужно найти все файлы и обработать их.
Проблема заключается в том, что при том, как он структурирован, если я хочу найти FileA, мне нужно три раза 1016 * позвонить* (Root -> FolderA -> Folder1), который вы можете себе представить, значительно замедляет все это.
Я хочу обработать это параллельно, но не могу заставить это работать. Я пытался сделать это рекурсивно, используя GParsPool.withPool
с eachParallel()
, но я обнаружил, что параллельное программирование с рекурсией может быть опасным (и дорогим) уклоном. Я попытался сделать это линейно, создав синхронизированный список, который содержит все пути к каталогам, которые посещал каждый поток. Но ни один из них, похоже, не работает или не обеспечивает эффективного решения этой проблемы.
К вашему сведению, я не могу изменить метод listDirectory()
. Каждый вызов извлекает все объекты в этом пути.
TL; DR: Мне нужно найти параллельный способ обработки через файловую структуру облачного хранилища, где единственный способ получитьпапки / файлы создаются методом listDirectory(path)
.