Google Drive Rest Api и многопоточность.

 
 
 
Сообщения:1
Уважаемые знатоки, всем добрый день.
Имеется проект, в котором реализована аутентификация и получение информации о файлах на Google Disk.
Ввиду глубокой древовидной структуры, добираюсь до всех файлов с помощью рекурсии ( передаю в метод ID ROOT - папки, получаю всё что внутри нее, и так до конца)
Всего файлов очень много - примерно 40 000.

Закралась идея прилепить многопоточку.
Максимум, чего смог добиться - создание пула и 5 потоков ( каждый из них, в свою очередь, сканировал поддиректории ROOT-папки + тысячи папок\файлов внутри).
Т.е. я смог сократить время выполнения ~ в 5 раз.

Вопрос- можно ли создать пул, и 5 потоков, каждый из которых сканировал бы поддиректорию и возвращал ТОЛЬКО список файлов\папок в ней, НЕ ПРОВАЛИВАЯСЬ ГЛУБЖЕ, и на каждую возвращенную папку создавать новый поток, и т.д?
Т.е. после выполнения потока, создавать новый поток на каждую папку, которая вернулась из предыдущего потока.
( В дереве 400 папок с файлами - значит будет выполнено 400 потоков ).
Рабочий рекурсивный метод БЕЗ многопоточки:

( Сюда приходит список файлов\папок из ROOT директории )

public static void deeper_in_folders(List<File> file) {
        for (File f : file) {
            try {
                System.out.println(f.getName());
                // Если получили папку - рекурсивно её исследуем.
                if (f.getMimeType().equals("application/vnd.google-apps.folder") || f.getMimeType().equals("folder")) {
                    querry_deeper = "'" + f.getId() + "'  in parents and trashed=false";
                    deeper_in_folders(get_driveservice_v3_files(querry_deeper).getFiles());
                    // Если получили файл и у него подозрительные owners - пишем его
                } else {
                    owners = getOwners(f.getId());
                    if (!allEmailsAreGood) {
                        resultMap.add(new AuditMap(f.getName(), realOwner, f.getWebViewLink(), owners, allEmailsAreGood));
                    }
                }
            } catch (Exception ss) {
                System.out.println("deeper_in_folders = " + f.getName() + ss);
            }
        }
    }
Изменен:10 сен 2018 16:24
 
 
Сообщения:697
http://developer.alexanderklimov.ru/android/java/file.php
https://docs.oracle.com/javase/7/docs/api/java/io/File.html#listFiles()

плюс добавь к этому CompletableFuture

это примерно направление куда копать.
 
 
Сообщения:752
Gipfel:
после выполнения потока, создавать новый поток на каждую папку, которая вернулась из предыдущего потока.

не поток нужно создавать, а задание, чтобы избежать создания слишком большого количества потоков и исчерпания памяти.
Оформить его (задание) в виде Runnable и подавать на исполнение в пул потоков. Число потоков в пуле сделать ограниченным - 100, 1000, 10000 - поэксперементируйте.
Задание должно прочитать указанную папку и для каждого обнаруженного вложенного файла или папки сформировать новое задание.
 
Модераторы:Нет
Сейчас эту тему просматривают:Нет