最大80MBまで増加するテキストファイルがあります。
あるアプリケーションのログファイルです。
最大80MBまで達します。
80MBまで達したら新しいファイルが作成され、
そこにログが出力されます。
このログファイルの中身を読み取り、
ある処理をして、計算結果や、必要な箇所を別のテキストファイルに
出力するプログラムを作成しました。言語はVBScriptです。
このプログラムを10分に一度実行する必要があります。
そこで問題になってしまったのが、処理時間です。
前回の処理が終わらないまま10分が経過して
次の処理が開始されてしまうのです。
特にまずいのがデータ量の多い期末や年度末です。
そこでVBScriptよりも速くテキスト処理を行える言語を教えて下さい。
BATでもJScriptでもPerlでもCでもC++でもJavaでも何でも良いです。
教えて下さい。
よろしくお願いします。
No.5ベストアンサー
- 回答日時:
>ある処理をして
この内容によるのではないでしょうか。
私も似たようなことをしていまして、VBAでは遅い
ため、Cでマルチスレッドを使い、複数のファイルを
同時に処理して情報を収集することで高速化を図り
ました。しかし、情報の収集事態は格段に速くなり
ましたが、最終的にはExcelに出力されるため、
出来上がりの速度は目に見えた恩恵は得られて
いません。
解決手段ですが、先ずはマルチスレッドを進めます。
ディスクIOの多いプログラムではIO完了を待たずに
平行して処理が実行できるため効果が大きいのです。
これがダメならマルチプロセスによる処理です。
プロセス間は同期を取るのが難しいのですが、VBでも
実行可能な点が魅力です。情報や制御はウィンドウを
使うと便利です。
しかも、どういうわけか理論値より高速です。つまり、
2スレッドで処理すると、シングルスレッドに比べて
理論上は処理時間が半分になるはずですが、1/3とか
1/4になることが多いのです。
マルチスレッドやマルチプロセスを制御できる言語では
C、C++、Javaがあります。マルチプロセスならVBでも
使用可能です。尚、VBSはWindowsAPIが使えないので
不適当です。
No.4
- 回答日時:
言語よりもプログラムを見直す必要があると思いますが、
既に大きいメモリ領域を確保して、その上でオンメモリで処理させているなら無用な話ですが、
HDDにそのログファイルや作業データを置いて処理しているなら、
メモリを増設してそれをRAMディスクにすれば処理を高速化できるのではと思います。
SSDと言う手もありますが、高価だし書き込みは遅いので、一時的なデータの置き場ならRAMディスクの方に分があります。
処理が済んでから保存するデータをHDDにコピーして保存させればいいでしょう。
No.3
- 回答日時:
Perlなんかが速いと思います。
もっと速く!というのであればC/C++で書くのがいいでしょう。
が
プログラム、というかやり方にそもそも問題があるように思えます。
10分ごとに毎回、ログファイルを頭から読んで処理するのでしょうか?
たとえば
以前に読んだ部分は読み飛ばして増加した行だけを読み込み
前回の処理結果に追加する、
というようなやり方を検討する必要があると思います。
それと案外、DISKアクセスのスピードもバカになりません。
対象のファイルがもしネットワークドライブに存在するとかなら
ローカルで処理するようにするべきでしょうし、
ファイルを読み込みながら結果を書き出す、というやり方をしているのであれば
最初に全てメモリに読み込んで処理をしてあとから一気に書き出す
という方法に変えるなど。
どうしても10分毎にやらないといけない処理だけに絞り込んで
残りは夜間バッチでやるとか。
そもそも10分毎をやめて30分毎ぐらいで妥協するとか。
あとは処理速度の速いマシンで実行するようにする、
メモリをめいいっぱい積み込む、
などなど。
No.2
- 回答日時:
主観でお答えしてよいのでしたら、Perlかと思います。
そもそも、大容量のファイルを一度に処理しようとするとキャッシュが一杯になるかもしれませんし、ディスクI/Oも食われるため余計に処理時間がかかると思います。
一旦、テンポラリにコピーして分割するのはいけないのでしょうか?
こちらの方が書かれているのがPerlでファイル分割するスクリプトです。
http://7to3.net/journal/2008/03/17/perl/
当然、容量を指定して分割するスクリプトも書けるとは思います。
その後、ゆっくりVBScriptでテキスト処理するのはどうでしょうか?
システムの都合でそれができないのでしたら仕方ないかと思いますが。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 【VBA】指定フォルダに格納中のテキストファイルをエクセルで処理し結果のエクセルを新規フォルダに保存 1 2022/03/25 14:19
- その他(プログラミング・Web制作) プログラミング 処理速度 1 2022/11/25 11:05
- Java java 次の機能を有するメソッドを自クラスに作成し、実装したいです。 機能 名前判定機能 →名前が 3 2022/06/16 16:08
- IT・エンジニアリング 不具合の現状認識をしないプログラマって信用できる人? できない人? 8 2023/07/28 09:09
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/21 09:42
- 国家公務員・地方公務員 公務員試験の数的処理で苦戦しています。 1 2023/01/30 08:56
- 仕事術・業務効率化 スローライフって、どう思いますか? 1 2022/11/07 03:31
- Excel(エクセル) vba レジストリの値を読み込教えてください教えてください 1 2023/07/14 14:09
- Java java 飾子を付けること(public static・・・) ・コンソールへの出力処理はmainメ 2 2022/06/16 19:34
- その他(IT・Webサービス) 高速処理可能な表計算ソフトについて ExcelやGoogleスプレッドシートのような表計算ソフトで、 2 2023/04/29 16:06
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
小数点を含む数値かどうか判断...
-
SQLの速度をあげるには・・・
-
win10で、正確な待ち時間の作り方
-
DoEvents関数って何?
-
エクセルVBA 時間抜けの取得
-
逆ポーランド記法における単項...
-
音程とテンポを独立して変化さ...
-
C言語 時刻差分の算出方法
-
If Not c Is Nothing Then ~延...
-
絶対パスの取得について
-
Excel(VBA)でSetTimer関数を使...
-
Excel VBA データ削除の高速化
-
[C言語]puts()について
-
異なるプログラミング言語を連...
-
プログラミングの授業でPython...
-
Do~Loopステートメント
-
Macターミナルで実行中のプログ...
-
緯度、経度の 10進法と 60進法...
-
バックグラウンドのプロセスの...
-
VBSの処理中一旦処理を止めて再...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
DoEvents関数って何?
-
win10で、正確な待ち時間の作り方
-
Excelでのセル内容の高速消去方法
-
小数点を含む数値かどうか判断...
-
Chat GPTに、課題として、二と...
-
SQLの速度をあげるには・・・
-
絶対パスの取得について
-
WebBrowserの読み込み待ちの処...
-
実行時のCPU使用率を増やしたい
-
ノットイコールを教えて下さい
-
プログラム上のCPU稼働率低減に...
-
Excel(VBA)でSetTimer関数を使...
-
C言語:関数を使うメリットとデ...
-
あっち向いてホイのプログラム...
-
VC++2010 GDIオブジェクトの解...
-
If Not c Is Nothing Then ~延...
-
Excel VBA での処理時間計測結...
-
符号付きにすべきか、符号なし...
-
ソートにかかった時間を測りたい。
-
プログラミングの授業でPython...
おすすめ情報