- 締切済み
膨大データ処理を高速化したい
仕事上、膨大データ処理を行っており、その処理に一度の処理に何十分も掛かり困ってます。 OSはWindows7でCPUはCore5、メモリ4GBの環境でも何せこれだけの膨大データなので。 その方法としてインメモリというメモリに対象データを格納してHDDを介さず高速データ処理が可能な技術もあるそうですが、どうやらそれは個人向けの技術ではなさそうですね。 ですが膨大データ処理を行ってる以上、高速処理を実現させる必要があり、できれば個人でもインメモリを実現させたいです、またインメモリに代わる高速処理の方法があれば教えて下さい。
- みんなの回答 (25)
- 専門家の回答
みんなの回答
- ki073
- ベストアンサー率77% (491/634)
No.7,12です。 少し気になるところを、 >別の質問掲示板で私の使ってるソフトを使用してる人がマルチコア非対応なのでCore i7のPCでも速くならなかったと書かれてたのを読みました。 普通コンパイルしただけでは、マルチコア対応になりません。マルチコア対応するには、市販のコンパイラ(インテルやPGIなど)では自動並列化オプションがあり並列化可能であれば並列化(いわゆるマルチコア対応)してくれます。しかし並列化ができるようにプログラムの構造をしていないと原理的にできません。無料で使えるようなものだとopenMPなどで手動で並列化を指示していきますが、これをミスると正しい答えがでません(エラーもでない)ので、ミスを防ぐために私自身は市販のコンパイラで自動並列化に対応した書き方をしています。 C言語の場合は、ポインターの場合はrestrictを適切に使うと最適化がうまく行く場合があります。またconstも効果があります。ポイターよりも配列の方が高速になりやすい傾向がありますが、でもプログラムの書き方が一番影響します。 >プロンプトでの処理 という言葉がたびたび出てきますが、何を指しているのでしょうか? C言語など一般的なプログラミング言語に書き換えができるのでしたら、まずプロファイラを使って時間がかかる処理を特定するのが一番最初にやる作業です。足を引っ張っている部分はプログラム全体から見るとほんの少しですので、そこだけを高速化すれば良いのです。
- SortaNerd
- ベストアンサー率43% (1185/2748)
処理対象を分割する事はできませんか? できるなら複数同時に走らせれば速くなるでしょう。 そうでなければプログラムを新規開発する以外に方法は思いつきません。
補足
回答、情報提供どうもありがとうございます。 返答が遅れてすいません。 分割はまず無理だと思います、計算の仕方が複雑な構造なので、対象データ全体を計算しないと正しい結果を出す事は難しい気がします。 回答を拝見した後、ソフトウェアで時間の掛かる処理だけならプロンプトでの実行でどうにかならないかという方法を思い立ちボーランドC++をインストールして膨大データの処理のスクリプトを作成、コンパイルして試してみましたが、プロンプトでの処理だとソフトウェアより遥かに時間が掛かってしまってます。 プロンプトでC言語を動かす事は久しぶりで、あまり満足にプログラミングはできてませんが、高速処理をプログラミングで実現できる事を試して行こうと思います。 なので今度はプロンプトでのC言語スクリプトをいかに高速的に実行させれるかが問題になってきます。
演算に使っているプログラム自体をいじれないのならば、PCの環境で速くするしかありません。 インメモリだのは、プログラム自体を書き換える(新規作成する)必要があり解決方法になりえません。 (たったの200MB程度なら、ほぼインメモリで動いているような気がしますが) 他の方もちらっと書かれていますが、以下の施策が現実的でしょう。 ・以下のスペックのPCを用意してください。 CPU Core i7-4790K メモリ 16GB マザー Z97チップセットのもので、オーバークロックが簡単に出来る機能を持ったもの CPUクーラー とりあえずよく冷えるものを OS Windows7 64bit ・PCはネットから切り離し、ウィルス対策系のソフト等余計な物は一切入れないでください。 ・OS上にRAMDISK(10GB程度)を構築し、ソースファイルやテンポラリファイルを全てRAMDISK上においてください。 ・冷房をよく効かせた部屋で、4.5GHz程度までCPUをオーバークロックします。 (ケースの側面を開けて、扇風機で冷気をたくさん当てると良いでしょう) ・この状態で計算を行います。 Core i7-4790Kは単発スレッドでもほぼ最速で動きますから、これ以外の選択肢はあり得ません。 ディスクIOでどの程度足を引っ張っているか分かりませんが、おまじない程度でRAMDISKを利用します。 (ある程度メモリの多い環境では数GB程度はキャッシュメモリにデータを置くため、200MB程度でHDDがガリガリ言い続けることはあり得ません) これ以上はプログラム自体を書き換えなければならないので、実現方法はありません。
補足
回答、情報提供どうもありがとうございます。 返答が遅れてすいません。 ちなみに自身のはCore5、メモリ4GBですが言われた通りの環境にすると金も掛かり大変ですね、それよりメモリのボトルネックより4GBのメモリの幅を満足に活かせない気がします。 別の質問掲示板で私の使ってるソフトを使用してる人がマルチコア非対応なのでCore i7のPCでも速くならなかったと書かれてたのを読みました。 回答を拝見した後、ソフトウェアで時間の掛かる処理だけならプロンプトでの実行でどうにかならないかという方法を思い立ちボーランドC++をインストールして膨大データの処理のスクリプトを作成、コンパイルして試してみましたが、プロンプトでの処理だとソフトウェアより遥かに時間が掛かってしまってます。 プロンプトでC言語を動かす事は久しぶりで、あまり満足にプログラミングはできてませんが、高速処理をプログラミングで実現できる事を試して行こうと思います。 なので今度はプロンプトでのC言語スクリプトをいかに高速的に実行させれるかが問題になってきます。
- ki073
- ベストアンサー率77% (491/634)
No.7です。 補足欄からは全体像が見えないのですが、 数値計算のようなプログラムなのか、データベースのようなテキスト処理しているプログラムなのかも見えてきません。どちらなのでしょうか?それとも全く別の種類のものなのか?? あくまでも直感なのですが、ファイル自体の読み込みが遅いというよりは、それを処理する部分が遅いのだと思うのですが、 その場合には、そのプログラム言語のコンパイラの新しいのが存在すればコンパイルし直せば多少は速くなるかも知れませんが、2倍も速くなれば上出来でしょう。時々スクリプトと書かれているので、インタープリタで動く様なものなのでしょうか? いずれにしても、ある程度は書き直さないと難しいような印象を持ちます。 「プログラムのコアな部分」は書き換えられないという印象ですが、前処理を分離可能ならそこを分離して速度を稼ぐのも手ですが、「プログラムのコアな部分」の実行時間が長いのでしたらほとんど効果は期待できないです。
補足
回答、情報提供どうもありがとうございます。 返答が遅れてすいません。 問題のデータ処理ですが、数値だらけのデータを読込み膨大量の計算してその結果を出力するものです。 ソフト用の独自言語でコンパイルして実行させてます。 回答を拝見した後、ソフトウェアで時間の掛かる処理だけならプロンプトでの実行でどうにかならないかという方法を思い立ちボーランドC++をインストールして膨大データの処理のスクリプトを作成、コンパイルして試してみましたが、プロンプトでの処理だとソフトウェアより遥かに時間が掛かってしまってます。 プロンプトでC言語を動かす事は久しぶりで、あまり満足にプログラミングはできてませんが、高速処理をプログラミングで実現できる事を試して行こうと思います。 なので今度はプロンプトでのC言語スクリプトをいかに高速的に実行させれるかが問題になってきます。
- mk48a
- ベストアンサー率56% (1133/2007)
とりあえずファイルの入力がボトルネックになっているようであれば、RAMディスクを使ってみると少しは速くなるかも。 テキストファイルをRAMディスク上に置くとファイルI/Oが速くなります。 RamPhantomEX http://www.iodata.jp/product/soft/speed/ramphantomex/ 200MBくらいだったら体験版で作成できるので確認してみても損はないかと。 手間もそんなにかからないし。 言語自体の処理能力の問題だったとすると特殊なものらしいので、地道にいろいろ試してみるしか方法は無いかと思います。
補足
回答、情報提供どうもありがとうございます。 返答が遅れてすいません。 マザーボートを弄る事なくソフトのみでRAMが実現できる事は驚きです。 その後、ソフトウェアで時間の掛かる処理だけならプロンプトでの実行でどうにかならないかという方法を思い立ちボーランドC++をインストールして膨大データの処理のテストを試してみましたが、プロンプトでの処理だとソフトウェアより遥かに時間が掛かってしまってます。
- kmee
- ベストアンサー率55% (1857/3366)
そういう大事なことは最初に言ってくれないと 計算が遅いなら、速いプログラムを別の言語で作って、計算結果だけ読み込ませる、とかできませんか? 読み込みが遅いなら、テキスト以外の速く読める形式に変換することはできませんか?
補足
ご回答ありがとうございます。 大事な事は最初に言うべきでした、すいません。 処理を速くしたければ言われる通り、そのソフトを使わずスクリプトオンリーで稼働させる必要がありますね。 そうして計算結果だけを取得する方法も思いつきます。 ですが作業上、目的のデータを正確に得るには、そのソフトを使う事が必要不可欠なのが現状です。 なんだかスクリプトの処理速度を上げるより、ソフトの問題になってしまいますね。 そのソフトは処理速度が遅いですが、現状それに代わるソフトは存在しません。 ソフトの問題なので、ソフトは処理速度の上げ方についての質問をいくつか知恵袋で見つけましたが、やはりスクリプトを効率的に書き直す他なさそうです。
- wormhole
- ベストアンサー率28% (1626/5665)
まず処理のどの部分がネックになっているかを調べる必要があるのではないでしょうか。 それをしない事には効率的な処理にする事などできませんし。 最悪、アルゴリズムから考え直さないといけない可能性もありますが。 ただ、そのスクリプトの処理系(ランタイム)がそもそも遅いとかいう場合はどうしようもないです。
補足
ご回答ありがとうございます。 稼働させるソフトは自分で作ったものではないので、ネックと言えば先に回答された方への補足で書いたとおりそのソフトが古くマルチコアに対処してないという事です。 結局はスクリプトを効率的に書き直して、余計な処理を外しスピード上げるしかないかなと思います。 皆様のおっしゃられる通りの方法で処理速度を上げたければ、そのソフトを使わずスクリプトオンリーで処理する方法しかないと考えられますが、作業上、このソフトを使わないとできません。
- IDii24
- ベストアンサー率24% (1597/6506)
C#でDatasetに読み込めば全てメモリ展開なんですけどね。その後はテーブルを焼くなり煮るなり出来るのし、クエリもかけられますし。メモリ上でリレーションも張ることも可能。データーベースもいりませんよ。結果は他のデーターセットに入れればそこからテキストで吐き出すのも早いですしね。XMLが一番早いですけど。 C#はMSのサイトから無料でダウンロードできますし。
補足
回答ありがとうございます。 皆様のご意見を参照する以前に、以下説明をする必要がある事に気付きました。 自分のやってる処理は、あるソフトウェアでC言語に似た独自の言語でプログラミングしたスクリプトを稼働させテキスト処理を行うものです。 おそらくそのソフトに処理を高速化する為の機能は特にないと思います、インメモリの設定もできないと思います。 なのでソフトに頼らず自分のスクリプトオンリーで処理するなら、皆様のご回答通りの解決策ができるかもしれませんが、作業上、このソフトを使う事が必要不可欠です。 しかも、そのソフトが古くマルチコア非対応なので、CPUをCore7にする等、どんなに処理スピードに優れたCPUを用いてもスピードアップはほとんど期待できないらしいです。 ですが、処理に時間を喰ってる事が作業のネックになってるのが現状で、こういう状況でも処理を速くできる方法はないか知りたく質問させて戴いた次第です。 今思いつく解決方法はスクリプトを効率的に書き直し、処理数をなるべく少なめにして目的の処理ができる事をするしかないと思います。
- ki073
- ベストアンサー率77% (491/634)
普段はGBクラスのテキストデータの一部を切り出してそれを読み込むことよくやっているのですが、 全部を読み込むということですよね。 あくまでもテキストファイルを数値データとして読み込んだ場合ですが、 質問さんと同程度の(CPUが1.6GHzなので低いかも)パソコンで200MBの数値が並んだファイルを全部読み込んでみました。 よく使っているソフトで試してみた結果、 Rで1分程度 Scilabは結構早くて10秒 Rubyで数値として読み込む簡単なプログラムで1分程度 でした。 Rubyでもテキストとして読み込むだけでしたら1秒以下ですので、数値化に時間がかかっているものと思われます。 読み込んだ後計算させても一瞬ですので、難しい計算をしない限りこの程度の時間で読み込めるということです。 まさかエクセルで読み込んでいるのではないですよね。
補足
回答ありがとうございます。 皆様のご意見を参照する以前に、以下説明をする必要がある事に気付きました。 自分のやってる処理は、あるソフトウェアでC言語に似た独自の言語でプログラミングしたスクリプトを稼働させテキスト処理を行うものです。 おそらくそのソフトに処理を高速化する為の機能は特にないと思います、インメモリの設定もできないと思います。 なのでソフトに頼らず自分のスクリプトオンリーで処理するなら、皆様のご回答通りの解決策ができるかもしれませんが、作業上、このソフトを使う事が必要不可欠です。 しかも、そのソフトが古くマルチコア非対応なので、CPUをCore7にする等、どんなに処理スピードに優れたCPUを用いてもスピードアップはほとんど期待できないらしいです。 ですが、処理に時間を喰ってる事が作業のネックになってるのが現状で、こういう状況でも処理を速くできる方法はないか知りたく質問させて戴いた次第です。 今思いつく解決方法はスクリプトを効率的に書き直し、処理数をなるべく少なめにして目的の処理ができる事をするしかないと思います。
- mk48a
- ベストアンサー率56% (1133/2007)
>データはテキストで形式はTXT、容量は200MBくらいです。 別に膨大というほどの量ではないです。 適切にプログラムすればインメモリ(データベース?)とか使わなくても普通にメモリ上に保持できる容量です。 >それを一行一行読込んでいくので時間が掛かります。 言語は何でしょうか? あと、プログラムの改変は可能でしょうか? この文だけだと1行ごとにファイルをopen,closeしているように受け取れますが、それだと時間がかかるのもわかります。 改変が可能であればファイルを一度に読み込んで、メモリ内で処理するするように変更して(もらって)ください。
補足
回答ありがとうございます。 皆様のご意見を参照する以前に、以下説明をする必要がある事に気付きました。 自分のやってる処理は、あるソフトウェアでC言語に似た独自の言語でプログラミングしたスクリプトを稼働させテキスト処理を行うものです。 おそらくそのソフトに処理を高速化する為の機能は特にないと思います、インメモリの設定もできないと思います。 なのでソフトに頼らず自分のスクリプトオンリーで処理するなら、皆様のご回答通りの解決策ができるかもしれませんが、作業上、このソフトを使う事が必要不可欠です。 しかも、そのソフトが古くマルチコア非対応なので、CPUをCore7にする等、どんなに処理スピードに優れたCPUを用いてもスピードアップはほとんど期待できないらしいです。 ですが、処理に時間を喰ってる事が作業のネックになってるのが現状で、こういう状況でも処理を速くできる方法はないか知りたく質問させて戴いた次第です。 今思いつく解決方法はスクリプトを効率的に書き直し、処理数をなるべく少なめにして目的の処理ができる事をするしかないと思います。
補足
回答、情報提供どうもありがとうございます。 紹介された市販のコンパイラですが数万くらいしますね。 openMPは無料なのでどんなものか試してみました。 gccコンパイラをインストールして以下プログラムで #include <stdio.h> #include <omp.h> int main() { int i; #pragma omp parallel { #pragma omp for for(i=0;i<300;i++)printf("(%d) Hello, Mercurium!\n",i); } return 0; } 並列処理を実行し、次にopenMP(#include <omp.h>)を外し普通の実行もしてみましたが全然速くなった感じはしませんでした。 また以下の様な手順でコマンドでプロファイラ出力を試してみましたが 、コマンドの入力も間違ってないと思うのに not in executable format というメッセージが出てできませんでした。 1.以下コマンド入力 gcc -pg -o abc abc.c 2.abc.exeを実行する。 3.以下コマンド入力 ./abc 4.以下コマンド入力 gprof gmon.out