gsutil без -m многопоточности / параллельного поведения по умолчанию - PullRequest
0 голосов
/ 23 сентября 2019

Я пытаюсь выяснить, вызывается ли gsutil mv без опции -m, каковы значения по умолчанию.В исходном коде config.py я вижу, что он выглядит даже без опции -m, по умолчанию будет рассчитываться количество ядер ЦП и задано это вместе с 5 потоками.Таким образом, по умолчанию, если у вас есть 4-ядерный компьютер, вы получите 4 процесса и 5 потоков, в основном многопоточные из коробки.Как бы мы узнали, что делает -m, я думаю, я видел в какой-то документации, что -m по умолчанию имеет 10 потоков, но сколько процессов порождается?Я знаю, что вы можете переопределить эти настройки, но что по умолчанию с -m?

should_prohibit_multiprocessing, unused_os =ShouldProhibitMultiprocessing()
if should_prohibit_multiprocessing:
  DEFAULT_PARALLEL_PROCESS_COUNT = 1
  DEFAULT_PARALLEL_THREAD_COUNT = 24
else:
  DEFAULT_PARALLEL_PROCESS_COUNT = min(multiprocessing.cpu_count(), 32)
  DEFAULT_PARALLEL_THREAD_COUNT = 5

Также команда mv в цикле for воспользуется преимуществом -m или будет просто кормить gsutil команда по одной делает рендеринг параллельно устаревшим?Причина, по которой я спрашиваю, потому что для выполнения описанного ниже цикла с 50000 файлами потребовалось 24 часа, я хотел знать, использовал ли я опцию -m, если это помогло бы?Не уверен, что при вызове команды gsutil каждая итерация позволит выполнить полную многопоточность, или она просто сделает это с 10 процессами и 10 потоками, увеличивая ее вдвое?

#!/bin/bash

for files in $(cat listing2.txt) ; do  
    echo "Renaming: $files --> ${files#removeprefix-}"
    gsutil mv gs://testbucket/$files gs://testbucket/${files#removeprefix-}
done

1 Ответ

0 голосов
/ 24 сентября 2019

Благодаря комментаторам @guillaume blaquiere я разработал программу на python, которая будет обрабатывать вызовы API для перемещения файлов в облаке с 25 одновременными процессами.Я поделюсь кодом здесь, чтобы помочь другим.

import time
import subprocess
import multiprocessing


class GsRenamer:
    def __init__(self):
        self.gs_cmd = '~/google-cloud-sdk/bin/gsutil'

def execute_jobs(self, cmd):
    try:
        print('RUNNING PARALLEL RENAME: [{0}]'.format(cmd))
        print(cmd)
        subprocess.run(cmd, check=True, shell=True)
    except subprocess.CalledProcessError as e:
        print('[{0}] FATAL: Command failed with error [{1}]').format(cmd,
                                                                     e)

def get_filenames_from_gs(self):
    self.file_list = []
    cmd = [self.gs_cmd, 'ls',
           'gs://gs-bucket/jason_testing']
    p = subprocess.Popen(cmd, stdout=subprocess.PIPE)
    output = p.stdout.readlines()
    for files in output:
        files = files.decode('utf-8').strip()
        tokens = files.split('/')[-1]
        self.file_list.append(tokens)
        self.file_list = list(filter(None, self.file_list))

def rename_files(self, string_original, string_replace):
    final_rename_list = []
    for files in self.file_list:
        renamed_files = files.replace(string_original,
                                      string_replace)
        rename_command = "{0} mv gs://gs-bucket/jason_testing/{1} " \
                         "gs://gs-bucket/jason_testing/{2}".format(
            self.gs_cmd, files, renamed_files)
        final_rename_list.append(rename_command)
        final_rename_list.sort()
    multiprocessing.pool = multiprocessing.Pool(
        processes=25)
    multiprocessing.pool.map(self.execute_jobs, final_rename_list)


def main():
    gsr = GsRenamer()
    gsr.get_filenames_from_gs()
    #gsr.rename_files('sample', 'jason')
    gsr.rename_files('jason', 'sample')


if __name__ == "__main__":
    main()
...