質問

マルチタスクプログラミング

ド素人な質問ですみません、マルチタスクを意識したプログラミングをC言語で実現するにはどうしたらよいのでしょうか?

自前のHPにあるデータ数十万件をバッチを組んでデータの移行を考えていますが、その移行方法として工夫無しですと理論値で半年かかることがわかり、何とか移行時間を縮められないかなと考えている中、マルチタスクでプログラミングしてみたらどうかな?と思ったのが始まりです。

C言語の経験は大学で習った程度(なんとなくポインタが分かる程度)ですが、具体的な方法など教えていただければと思ってます。

また、ほかにもっとこっちのほうがいいとかありましたらご教授ください。

通報する

回答 (4件)

失礼、マルチタスクでしたね。
言葉が違いますが、マルチスレッドと同じことです。

この回答へのお礼

まだまだ勉強が必要ってことですね

マルチスレッドにすること自体はすごく単純です。

バッチファイルを別データで複数走らせるだけです。
ご自分でマルチスレッドにしなくてもOSがやってくれます。

勿論、今回のケースでは意味が無いでしょうけど。

そもそもデータ変換はプログラムの時点でマルチスレッドが
必要とされる処理ではありません。
それからポインタが分かるくらいでマルチスレッドのプログ
ラミングは敷居が高すぎて、説明も困難と思います。

もっと言えば、WindowsでしたらVisual C/C++などで作られる
プログラムは元々マルチスレッドです。
これはWindowやマウス/キーボードなどの管理がマルチスレッド
処理を要求するためです。

何度も書きますがデータ変換ではマルチスレッドプログラミングの
要件にはならないでしょう。

この回答へのお礼

ありがとうございます。
計算もしなおして、方法も模索しなおしてみます。

たかが数十万件でなんで半年もかかるのか不思議です。
コンピュータやOSに何を使っているか書かれていませんので一般論になりますが…。

いくらマルチタスク化してもコンピュータの性能が上がるわけではありません。
データ移行プログラムが非常に多くのウエイトをしながらゆっくり処理していてCPU使用率が低いのなら、マルチ化したらCPUを有効に使え、早く終わることになりますが・・・
データ移行プログラムは普通はそんな作り方はしないと思います。

1本のプログラムが1つのCPUを100%使っていた場合、マルチ化して2本にすると1本あたりは50%しか使わなくなり(実際はタスク切り替えが走るので50%未満になる)シングルで処理した場合と同等以下のスピードにしかなりません。

もしもプログラムを実行するコンピュータが、複数個のCPUやマルチコアのCPUを搭載している場合なら「マルチスレッド化」すれば早くなります。

ただ、まずは、たかが数十万件で半年もかかるプログラムの見直しをされてみては?
どこで時間がかかっているか特定できますか?
冗長な処理はないでしょうか?

この回答へのお礼

マルチスレッドにするにはどうしたらいいのでしょうか

>工夫無しですと理論値で半年かかることがわかり
 
マルチタスクにしても「1台のPCで半年かかる」のは変わりません。
 
逆に、マルチタスクにした場合「マルチタスクのオーバーヘッド」の分だけ、余計に時間がかかります。
 
>また、ほかにもっとこっちのほうがいいとかありましたらご教授ください。
 
ぶっちゃけて言えば「シンプルなプログラムで、複数台のPCで同時進行」が最も効果的。
 
例えば、5台のPCを用意し、データを5分割(50万件あるなら、10万件づつ)して、5台同時に処理を開始すれば良いのです。たったそれだけで「5分の1の時間」で終ります。
 
てゆ~か、当方も100万件クラスのデータを扱う事がありますが、どんな複雑な処理でも「全件やったら半年かかる」なんて事は起きません。
 
たぶん、処理開始のオーバーヘッドにかかる時間など「件数に掛け算してはいけない時間」も掛け算してしまったなど「論理値の求め方が間違っている」と思われます。
 
「1件あたりにかかる時間」を求める場合は以下のようにします。
1.「1件」を処理した場合の時間を計る
2.「10件」を処理した場合の時間を計る
3.「100件」を処理した場合の時間を計る
4.それぞれが「5.3秒」「6.2秒」「15.3秒」だった場合
t1=a+b=5.3
t2=10a+b=6.2
t3=100a+b=15.3
より、a≒0.1、b≒5.2を求め、aを「1件あたりの時間」とします(bはオーバーヘッドにかかる時間)
 
上記の場合、100万件では「1000000×0.1+5.2=100005.2秒(約27.7時間)」になります。
 
「1件で5.3秒だったから」と単純に「1000000×5.2」で計算してしまうと「5200000秒(約60日間)」となり、誤った時間予測をしてしまいます。
 
どう考えても「予測計算を間違っている」ので「計算に含めない、オーバーヘッド時間を除いて再計算」してみる事をお勧めします。

この回答へのお礼

おっしゃる通り計算間違いでした

このQ&Aは役に立ちましたか?1 件

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

新しく質問する

注目の記事

おしトピアプリ登場記念!コメントで最大1万円分のギフト券があたる!

話題のトピックにさくっとコメントできる「おしトピ」にAndroid版アプリに続きiPhoneアプリも登場! どちらかのアプリをダウンロードして指定のオーダーにコメントした方に抽選で最大1万分のアマゾンギフト券をプレゼント! フジテレビ出身のフリーアナウンサー長谷川豊氏の質問にも回答受付中!

このQ&Aを見た人が検索しているワード


新しく質問する

このカテゴリの人気Q&Aランキング

毎日見よう!教えて!gooトゥディ