没有 -m 多线程/并行默认行为的 gsutil
gsutil without -m multithreading / parallel default behavior
我想知道是否在没有 -m
选项的情况下调用 gsutil mv
,默认值是多少。我在 config.py
源代码中看到,即使没有 -m
选项,默认情况下也会计算 CPU 内核的数量并将其与 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
for
循环中的 mv
命令也会利用 -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
感谢评论者@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()
我想知道是否在没有 -m
选项的情况下调用 gsutil mv
,默认值是多少。我在 config.py
源代码中看到,即使没有 -m
选项,默认情况下也会计算 CPU 内核的数量并将其与 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
for
循环中的 mv
命令也会利用 -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
感谢评论者@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()