テキスト処理の速い言語を教えてください

このQ&Aのポイント
  • 最大80MBまで増加するテキストファイルの処理を高速化する言語について教えてください。
  • VBScriptでは処理時間が長くなるため、特にデータ量が多い期末や年度末に問題が発生します。
  • BATやJScript、Perl、C、C++、Javaなど、テキスト処理に適した言語を教えてください。
回答を見る
  • ベストアンサー

テキスト処理の速度の速い言語

最大80MBまで増加するテキストファイルがあります。 あるアプリケーションのログファイルです。 最大80MBまで達します。 80MBまで達したら新しいファイルが作成され、 そこにログが出力されます。 このログファイルの中身を読み取り、 ある処理をして、計算結果や、必要な箇所を別のテキストファイルに 出力するプログラムを作成しました。言語はVBScriptです。 このプログラムを10分に一度実行する必要があります。 そこで問題になってしまったのが、処理時間です。 前回の処理が終わらないまま10分が経過して 次の処理が開始されてしまうのです。 特にまずいのがデータ量の多い期末や年度末です。 そこでVBScriptよりも速くテキスト処理を行える言語を教えて下さい。 BATでもJScriptでもPerlでもCでもC++でもJavaでも何でも良いです。 教えて下さい。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • nda23
  • ベストアンサー率54% (777/1415)
回答No.5

>ある処理をして この内容によるのではないでしょうか。 私も似たようなことをしていまして、VBAでは遅い ため、Cでマルチスレッドを使い、複数のファイルを 同時に処理して情報を収集することで高速化を図り ました。しかし、情報の収集事態は格段に速くなり ましたが、最終的にはExcelに出力されるため、 出来上がりの速度は目に見えた恩恵は得られて いません。 解決手段ですが、先ずはマルチスレッドを進めます。 ディスクIOの多いプログラムではIO完了を待たずに 平行して処理が実行できるため効果が大きいのです。 これがダメならマルチプロセスによる処理です。 プロセス間は同期を取るのが難しいのですが、VBでも 実行可能な点が魅力です。情報や制御はウィンドウを 使うと便利です。 しかも、どういうわけか理論値より高速です。つまり、 2スレッドで処理すると、シングルスレッドに比べて 理論上は処理時間が半分になるはずですが、1/3とか 1/4になることが多いのです。 マルチスレッドやマルチプロセスを制御できる言語では C、C++、Javaがあります。マルチプロセスならVBでも 使用可能です。尚、VBSはWindowsAPIが使えないので 不適当です。

その他の回答 (4)

  • yama1718
  • ベストアンサー率41% (670/1618)
回答No.4

言語よりもプログラムを見直す必要があると思いますが、 既に大きいメモリ領域を確保して、その上でオンメモリで処理させているなら無用な話ですが、 HDDにそのログファイルや作業データを置いて処理しているなら、 メモリを増設してそれをRAMディスクにすれば処理を高速化できるのではと思います。 SSDと言う手もありますが、高価だし書き込みは遅いので、一時的なデータの置き場ならRAMディスクの方に分があります。 処理が済んでから保存するデータをHDDにコピーして保存させればいいでしょう。

回答No.3

Perlなんかが速いと思います。 もっと速く!というのであればC/C++で書くのがいいでしょう。 が プログラム、というかやり方にそもそも問題があるように思えます。 10分ごとに毎回、ログファイルを頭から読んで処理するのでしょうか? たとえば 以前に読んだ部分は読み飛ばして増加した行だけを読み込み 前回の処理結果に追加する、 というようなやり方を検討する必要があると思います。 それと案外、DISKアクセスのスピードもバカになりません。 対象のファイルがもしネットワークドライブに存在するとかなら ローカルで処理するようにするべきでしょうし、 ファイルを読み込みながら結果を書き出す、というやり方をしているのであれば 最初に全てメモリに読み込んで処理をしてあとから一気に書き出す という方法に変えるなど。 どうしても10分毎にやらないといけない処理だけに絞り込んで 残りは夜間バッチでやるとか。 そもそも10分毎をやめて30分毎ぐらいで妥協するとか。 あとは処理速度の速いマシンで実行するようにする、 メモリをめいいっぱい積み込む、 などなど。

  • axel_eye
  • ベストアンサー率64% (145/226)
回答No.2

主観でお答えしてよいのでしたら、Perlかと思います。 そもそも、大容量のファイルを一度に処理しようとするとキャッシュが一杯になるかもしれませんし、ディスクI/Oも食われるため余計に処理時間がかかると思います。 一旦、テンポラリにコピーして分割するのはいけないのでしょうか? こちらの方が書かれているのがPerlでファイル分割するスクリプトです。 http://7to3.net/journal/2008/03/17/perl/ 当然、容量を指定して分割するスクリプトも書けるとは思います。 その後、ゆっくりVBScriptでテキスト処理するのはどうでしょうか? システムの都合でそれができないのでしたら仕方ないかと思いますが。

  • koko_u_u
  • ベストアンサー率18% (216/1139)
回答No.1

> そこでVBScriptよりも速くテキスト処理を行える言語を教えて下さい。 多分言語の問題ではなくて、プログラム自体の問題だと思う。

関連するQ&A

  • C言語のテキストファイルの読込み

    必要に迫られてC言語でテキストファイルの読込みを行う プログラムを作成しなければならなくなりました。 whileとfscanfを用いて書式を指定して一行ずつ読込むことができる ということは知っていますが、その際、たとえば読み込むファイルが 20行のテキストファイルだったとして、10行目から読込みを 行いたい場合はどのようにプログラムを書けばいいのでしょうか? なにぶんC言語初心者ですのでよろしくお願いします。

  • C言語での置換処理について

    引数で指定されたディレクトリ配下のファイル全てに置換処理を行う 処理をC言語で作成したいと考えています。 ディレクトリ配下には、最大で100MB位のファイルが約100件存在する 想定です。 (ファイルのサイズ、件数は実行毎に異なります。) そこで2点ほど教えていただきたいことがあります。 1.基本的に、UNIXコマンドのtrコマンドでで置換するより、C言語で   全てのファイルを開き1行ずつ、「置換文字列のチェック」→   「置換文字列が存在すれば置換」→「ファイル書込み」と行った   ほうが早いものでしょうか?   (trコマンドを実行したところ、10分待っても処理が完了しませんでした。) 2.C言語にてディレクトリ配下のファイル名を取得し、ファイルの   件数分ループさせるにはどのようにすればよいのでしょうか?   execコマンドにて「ls -l test.txt | awk '{print $○}'」   (ファイル名のみ取得)の結果をファイルに出力し、そのファイル   からファイル名を取得し、EOFになるまでループすることで出来る   と思いますが、この方法は一般的でしょうか?   出来れば余計なファイルは、作成したくないと考えています。 ご回答の方、よろしくお願いします。

  • 素朴な疑問 (C言語とアセンブラの処理速度の違いについて)

    C言語で作成したプログラムをビルドして実行ファイルを作成するのと、アセンブラ言語(?)をアセンブルして作成した実行ファイルは、どうして処理速度が違うのでしょうか?例えば全く同じ処理を高級言語と低級言語で作成した場合、出来上がったそれぞれの実行ファイルの違いは、コンパイル時に吸収されてしまうわけではないのでしょうか?

  • VBScriptで削除処理

    初めまして。 VBScriptを今回初めて使用しながらスクリプトを作成しようとしています。 〔質問〕 以下のような削除処理をVBScriptにて実施したいのですが、どのような構文を書けばいいのでしょうか? ご教授お願いします。 以下、例を挙げ記述致します。 (例)処理日が2008/3/22の場合。 「AAAA」ディレクトリ配下の以下のログファイルを二日前までの日付になっているログファイルのみ残し、あとは全て削除するという処理をしたい。 AAAAディレクトリの配下 ・aa080319.log→削除 ・aa080320.log→削除 ・aa080321.log→残す ・aa080322.log→残す 上記例を用いますが、自分で考えた処理フローとしまして、 (1)「AAAA」ディレクトリ配下のファイル一覧をテキストファイルに書き込む。 (2)「(1)」で作成したテキストファイルを読み込み、「2008322」と「2008321」に一致しないログファイルを削除。 以上、宜しくお願いします。

  • C言語の処理速度について

    こんにちは C言語を使い始めました。 あるコードで ソース(1):デバッグ用にログを多めに吐き出すようにしているソース。 ソース(2):ソース(1)からログ排出だけコメントアウトしたソース。 を作ってみました。 ですが、 ソース(1)で機能確認後、ソース(2)にすると途端に処理速度が遅くなります。 (1)(2)で実質的な違いはログ排出のみなのですが、理由が分からず困っています。 【質問】 C言語でログ排出だけカットしたソースの方が処理速度が異様に遅い。 この対処策を質問させて下さい。 もし同じ経験された方がおられましたら是非アドバイスを頂ければ幸いです。 よろしくお願いします。

  • コマンド「dir」の結果を、テキストに出力

    batファイルを使用して、「dir」コマンドの結果を、既存のテキストファイル「dir.log」に出力したいのですが、実装方法を教えていただけないでしょうか? 詳細: ・dirバッチ:C:\work\dir.bat ・ログファイル:C:\work\dir.log ・dirで出力したいフォルダ:D:\work\配下 以下のリダイレクト?を使用して上書きしたいです。 dir >> dir.log どうか、ご教授お願いいたします。

  • PHPでexeファイル実行

    C言語でMPG形式の画像ファイルを読み込み、画像処理をしてテキスト形式で画像データを出力するプログラムを作成したのですが、 これをPHPプログラム内で動作させ、テキストデータ(できればバイナリのほうがいい)を読み取りたいと思います。 これはexeファイルをexecやsystem関数で実行することで解決できるのでしょうか? また、C言語の画像処理プログラムが画像を読み込んでからテキストデータを作成するまで1分ほどのタイムラグがあります。 どうすればPHP内の処理でexeファイル実行→exeがデータベースから画像を読み込む→ 1分処理待ち→テキスト作成→作成されたテキストデータをPHPで読み込み とできるのでしょうか? ちなみに、exeファイルとphpで作成した画像データベースはサーバー機に置くつもりです。 テキストデータを介さなくても、C言語プログラムからphpに直接データを渡す方法があればそちらのほうが望ましいです。 連続投稿で申し訳ないのですが、急を要するのでぜひともご解答お願いします。

    • ベストアンサー
    • PHP
  • C言語でテキストファイルのデータ処理

    はじめまして。 僕はC言語に関して全くの初心者です。 どうぞよろしくお願いします。 例えば、 1,0,0,7,6 2,0,0,5,5 3,1,0,4,9 : : のようなテキストファイル、test.txtがある時、 1行目の4カラム目(7)と5カラム目(6)を、 それぞれの行について差し引くプログラム、 つまり全ての行について4カラム目は7を引き、 5カラム目は6を引くプログラムの事で、 この例では、 1,0,0,0,0 2,0,0,-2,-1  3,1,0,-3,-3 : : となるようなプログラムを書き、結果を出力したいのですが、よく分かりません。 ちなみにawkで書いて実行すると、 (プログラム名はtest.awkとする) BEGIN{ i=0; } { while(i<1){ v3 = $4; v4 = $5; i++; } print $1,$2,$3,($4 - v3),($5 - v4); } 実行するプログラム↓ awk -f test.awk test.txt という感じなのですが…。 これを上述の様に、C言語でプログラムを書いて、 実行するには、例えばどのようなプログラムを書けば いいのでしょうか? なにぶん初心者のため、分からない事だらけですが、 よろしくお願いしますm(__)m

  • C言語でアナグラムを求めるプログラム

    C言語初心者で、勉強中です。 今アナグラムを求めるプログラムをC言語で作成しています。 内容はあらかじめある英単語が書いてあるテキストファイルから互いにアナグラムとなっている英単語をすべて求めてそれを出力するというプログラムです。 どこから手をつけていいかわからず悩んでいます。 そこでヒントをいただこうと思って質問しました。 どなたか回答よろしくお願いします。

  • C言語で16進数をテキスト出力したい。

    お世話になります。 件名の内容で、参考になるサイトや手法などをご教授願います。 【件名】C言語で16進数をテキスト出力したい。 【環境】OS:WindowsXPsp2 コンパイラ:borlandC 【詳細】 現在、C言語で以下の手順で処理を行うプログラムを作成しております。 手順1:ASCIIコードで記載されたテキストをUTF8コードに変換 手順2:UTF8に変換された1行目の文字列を16進数コードフォーマットをファイル名にして保存 手順2の16進コードフォーマットのファイル名にして保存する作業で fprintf(buff,"%x",UF8); //"buff"保存ファイル名、"UTF8"1行目文字列 を用いて行えるかと思ったのですが、どうやら直接16進数の名称を吐き出すことが不可能なようで、どのように行ったらいいか皆目検討がついておりません。 そこで大変恐縮ですが、参考になる手法や、情報がありますサイト等をお教え頂けると幸甚です。 よろしくお願いいたします。

専門家に質問してみよう