同じ機能を適用したいcsvファイルが数十万個あります。次のダミー関数のようなもの:
def process_single_file(fname):
df = pd.read_csv(fname)
# Pandas and non-pandas processing
df.to_csv(f"./output/{fname}")
すべてのファイルを個別にループするのは時間がかかりすぎるので、私の質問は、この実行をスケジュールして並列化するための最も効率的な方法は何ですか。プロセスは相互に依存していません。私はPythonを使おうと試み始めましたmultiprocessing
:
import multiprocessing
files = sorted(glob.glob("./input/*.csv"))
processes = []
for fname in files:
p = multiprocessing.Process(target=process_file, args=(fname,))
processes.append(p)
p.start()
for process in processes:
process.join()
しかし、私のコンピューターは、すべてのCPUにすぐに過負荷をかけ、速度低下とクラッシュを引き起こすため、このプロセスを好まないようです。すべてのCPUのワークロードを削減しDask
、Bash
スクリプトの使用や変更などのタスクをスケジュールするためのより効率的な方法はありpython
ますか?前もって感謝します。
それは本当にあなたのボトルネックがどこにあるかに依存します:あなたはファイルの読み取り/書き込み、またはCPU処理の作業により多くの時間を費やしていますか?
このRealPythonチュートリアルは、これらすべてについて学ぶのに本当に役立ちました。良い読み物をお勧めすることしかできません;)
チュートリアルで説明されているように、I / Oの場合、マルチスレッドで十分です(マルチプロセッシングよりも優れている可能性があります)。
def process_all_files(files):
with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
executor.map(process_single_file, files)
また、CPUの場合、マルチプロセッシングを使用すると、使用可能なすべてのコアを使用できます。
def process_all_files(files):
with multiprocessing.Pool() as pool:
pool.map(process_single_file, files)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加