3

Я только что работаю над API Google Диска. У меня одна проблема, она слишком медленная. Я использую такие методы, как в документации. Например:API Google Диска - слишком медленно.

List<File> getFilesByParrentId(String Id, Drive service) throws IOException { 

    Children.List request = service.children().list(Id); 
    ChildList children = request.execute(); 

    List<ChildReference> childList = children.getItems(); 
    File file; 

    List<File> files = new ArrayList<File>(); 
    for (ChildReference child : childList) { 
     file = getFilebyId(child.getId(), service); 

     if (file == null) { 
      continue; 
     } else if (file.getMimeType().equals(FOLDER_IDENTIFIER)) { 
      System.out.println(file.getTitle() + " AND " 
        + file.getMimeType()); 
      files.add(file); 
     } 
    } 

    return files; 
} 

private File getFilebyId(String fileId, Drive service) throws IOException { 
    File file = service.files().get(fileId).execute(); 
    if (file.getExplicitlyTrashed() == null) { 
     return file; 
    } 
    return null; 
} 

ВОПРОС:, что метод работает, но слишком медленно, в течение примерно 30 сек.

Как это можно оптимизировать? Например, чтобы не получать все файлы (только папка или только файлы). или что-то типа того.

ответ

5

вы можете использовать параметр q и некоторые вещи, как:

service.files().list().setQ(mimeType != 'application/vnd.google-apps.folder and 'Id' in parents and trashed=false").execute(); 

Это поможет вам все файлы, которые не скоросшиватель, не громил и чей родитель имеет ID ID. Все по одному запросу.

И BTW, API не медленный. Ваш алгоритм, который делает слишком много запросов, есть.

+2

Для этого часто требуется более 5000 мс (для небольшого каталога). Это ожидалось? Или знак того, что я делаю что-то неправильно? (Пример log output: 04-27 22: 44: 56.247: I/System.out (16176): list: 0B0Y6LqaBUwT3ZEVLMEtIR2NGVHM взял 17799ms) –

+1

Согласен, api-запросы кажутся очень медленными. Я выполняю аналогичные поиски, как описано выше, и следующие примеры, описанные в документации API. Единственное, что я делаю, - и, возможно, есть лучший способ сделать это: для данного/известного каталога мне нужен каждый файл, независимо от того, как он вложен в подкаталоги в моем списке файлов. Я не говорю о 100-м файлах, но 1 или 20 или 30 макс, они просто организованы в разные подкаталоги, это просто подходит для того, чтобы вытащить данные! После того, как я получу список, я затем реорганизую его с помощью linq .. – kstubs

+0

.. [cont'd] Я не могу себе представить, что эти запросы linq медленны? Мне действительно нужно сравнить это. Его большое разочарование, и я надеюсь, что смогу оптимизировать. – kstubs

-1
public void getAllFiles(String id, Drive service) throws IOException{ 

    String query="'"+id + "'"+ " in parents and trashed=false and mimeType!='application/vnd.google-apps.folder'"; 
    FileList files = service.files().list().setQ(query).execute(); 

    List<File> result = new ArrayList<File>(); 
    Files.List request = service.files().list(); 

    do { 
     result.addAll(files.getItems()); 
     request.setPageToken(files.getNextPageToken()); 
    } while (request.getPageToken() != null && request.getPageToken().length() > 0); 

} 
+0

если мы используем mimeType! = 'Application/vnd.google-apps.folder', это исключает все папки и документы, находящиеся за пределами папки. –

Смежные вопросы