質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
並列処理

複数の計算が同時に実行される手法

ファイルI/O

ファイルI/Oは、コンピューターにおけるファイルの入出力です。これは生成/削除やファイルを読み込んだり、出力をファイルに書き込むようなディレクトリやファイルの運用を含みます。

マルチスレッド

マルチスレッドは、どのように機能がコンピュータによって実行したのかを、(一般的にはスレッドとして参照される)実行の複合的な共同作用するストリームへ区分することが出来ます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

5166閲覧

Pythonでのマルチスレッドを使用した、組み込み関数openによる複数ファイルIOは高速化が見込めるのでしょうか

abea

総合スコア32

並列処理

複数の計算が同時に実行される手法

ファイルI/O

ファイルI/Oは、コンピューターにおけるファイルの入出力です。これは生成/削除やファイルを読み込んだり、出力をファイルに書き込むようなディレクトリやファイルの運用を含みます。

マルチスレッド

マルチスレッドは、どのように機能がコンピュータによって実行したのかを、(一般的にはスレッドとして参照される)実行の複合的な共同作用するストリームへ区分することが出来ます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/10/01 09:45

PythonのマルチスレッドはGILによって基本的に1プロセスで1スレッドしか動かないということなので、あるプログラムを10スレッドで実行したとしても、実行するスレッドは1つでそれを高速に切り替えて平行に実行すると認識しています。
そのような動作ではCPUの計算リソースを多く使う処理をマルチスレッドにしても意味はなく、IO処理などスリープする時間が存在する処理しか高速化が期待できないらしいのですが、

質問としては以下のようにPythonの組み込み関数openを使用した複数ファイルIOをマルチスレッド処理することで高速化は期待できるのでしょうか?

Python

1from concurrent.futures import ThreadPoolExecutor 2 3def read_file(file_name): 4 f = open(filename, "r") 5 text = f.read() 6 f.close() 7 return text 8 9file_list = [str(i) + ".txt" for i in range(100)] 10 11with ThreadPoolExecutor(max_workers=100) as executor: 12 results = executor.map(read_file, file_list) 13 results = list(results)

Pythonの組み込み関数openはマルチスレッドによって高速化されるような、スリープする時間はあるのでしょうか?
また、上の例はファイルの内容を読み込む処理ですが逆にファイルに内容を書き込む処理でも同様でしょうか?
教えてくださるとありがたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

複数ファイルIOをマルチスレッド処理することで高速化は期待できるのでしょうか?

「高速化」の意味が逐次に処理する場合に比べて速くなるのか?ということであれば、答えは Yes です。
例えば、

  1. ファイルを読み出す(ディスクI/O依存処理) 1秒かかる
  2. 加工処理をする(CPU依存処理) 1秒かかる
  3. 結果をネットワークに書き出す(ネットワークI/O依存処理) 1秒かかる

これを10個のファイルに対して順次に行うと 30秒かかりますが、マルチスレッドにすることにより、異なるリソースの消費が並列化されますので、処理にかかる全体時間はうまくいけば 1/3 の約10秒で終わるでしょう。(厳密にはオーバヘッドや最初は同じリソースが競合するなどの問題があって、そうはなりません)
逆に単一のリソースがネックになるようなプログラム(例えば、処理時間のほとんどがディスクI/Oであるような場合)であれば、リソースの消費が並列化できないので、高速化は期待できないでしょう。
しかし、一般論で質問されていると仮定して答えは Yes だと思います。

もし、「高速化」の意味がディスクI/Oが並列化されて高速化されるのか?という意味であれば、答えは No です。

Pythonの組み込み関数openはマルチスレッドによって高速化されるような、スリープする時間はあるのでしょうか?

一般的に I/O のシステムコールは CPU ではないリソースを消費するので、CPUにとっては I/O 待ちになる場合が多く、CPUのリソースは空いた状態になります。これをスリープと呼ぶならスリープすると言えるでしょう。

上の例はファイルの内容を読み込む処理ですが逆にファイルに内容を書き込む処理でも同様でしょうか?

前述のとおり、 I/O のシステムコールは CPU ではないリソースを消費するという意味で書き込みでも読み出しでも同じです。

投稿2020/10/01 11:31

mit0223

総合スコア3401

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

ディスクの種類によると思います。
HDDの場合はマルチスレッドにしようが物理的に高速化出来ません。
NVMe対応SSDだとマルチスレッドで高速化が見込めるようですが、シーケンシャルアクセスだとさほど差は無いようです。
Windows 10世代のパーツ選び SSD編

ディスクIOそのものがボトルネックになるので、細かいデータを何回にも分けて書き込むと遅くなります。基本的に、メモリにバッファリングして多くのデータを一括で書き込んだ方が効率がいいです。

投稿2020/10/01 10:07

編集2020/10/01 10:14
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ファイルアクセスは並列化できないので、期待できません

投稿2020/10/01 09:48

y_waiwai

総合スコア88042

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

abea

2020/10/01 09:51

ありがとうございます マルチスレッドではなくマルチプロセスで上の処理を行った場合、ファイルアクセスが並列になされるので高速化は期待できる認識で合っていますか?
y_waiwai

2020/10/01 09:54

マルチプロセスにしようが、同一の物理ディスクに対するファイルアクセスは並列化できません せいぜいアクセス間の処理時間がケチれるぐらいですね ファイルアクセスと、CPUでの処理って組み合わせなら並列できますね
abea

2020/10/01 10:08

ありがとうございます つまり、ファイルアクセスを並列化するためにはそれぞれのファイルが別のディスクに分散していなければ不可能ということなのですね その場合はマルチスレッドを使っても並列に読み込めるのでしょうか?
y_waiwai

2020/10/01 10:15

別の物理ディスクであれば並列化は期待できるでしょうけど、今度はインターフェース(SATA)の転送がどうかって話になりますね まあ、こっちは転送速度の上限までは期待できますが
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問