• ベストアンサー

ファイルの読み込みが遅い

VC++6で、CSVファイル読み込むプログラムを作成しています。件数は、1万件ほどで、ファイルサイズは、20MBぐらいです。 CFile&CArchiveで、一行ずつ読み込んでいるのですが、徐々に遅くなっていきます。これは、しょうがないのでしょうか? 改善する方法は、あるでしょうか? よろしくお願いします。

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

  • ベストアンサー
  • zwi
  • ベストアンサー率56% (730/1282)
回答No.1

通常、CSVファイル20MBをメモリに読み込んだぐらいでは、速度低下(メモリスワップ)が発生するとは思えません(主メモリが128MB等、古いPCをお使いなら別ですが)。 私は、CArchiveを使ったことがありませんが、日ごろfopen()してfgets()やCStdioFileを使ってテキストファイルを読んでいて速度低下を感じたことはありません。 CArchive自体がメモリを大量消費するかぐらいしか原因は浮かびませんが、もしかすると全然関係ない原因(CPU負荷の増加)が別にあるのかもしれません。 実行中のメモリ消費量をチェックしてみることと、CStdioFileなどを使ったプログラムに書き換えてみてはどうでしょうか?

w0a15455
質問者

お礼

ほかのソース部分が原因でした。 お騒がせしました。申し訳ありません。 ありがとうございました。

関連するQ&A

  • PHP: CSVファイル扱いについて

    現在PHPであるデータを作成し、毎日CSVファイルに追記するPHPプログラムを作成しています。 /data/[ID]/2013.csv のような構成でファイルを作成し追記しています(1年で1ファイル) しかし、データ量が多く、ものによっては1年で50万行の量になってしまいます。 サイズでいうと50MBほどです。 ここで考えた案が2つあります。 (1)月ごとにファイルを作る (/data/[ID]/2013-03.csv のように月ごとにファイルを作成する方法) メリット: 簡単、分かりやすい デメリット: 無駄にファイルが増える (2)サイズが上限(20MBとか?)を超えたらファイルを作成する。 メリット: 無駄にファイルができない、スマート? デメリット: ちょっと複雑なプログラムになる。 素人目からはどちらでもよさそうなのですが、、 どちらが良いのでしょう?? また、違った画期的なアーカイブ方法はありませんでしょうか? また、どのくらいのCSVファイルサイズまでなら処理できるのでしょうか? お詳しい方、ご教示下さい。 お願い致します。

    • ベストアンサー
    • PHP
  • シリアライズ関数でのReadStringは読み直しができない?

    VC++6.0でMFCを使ってのCSVファイル入力を検討しています。 シリアライズ関数内でReadStringを使って1行づつ入力しているのですが、ファイル終端に達した後の処理として、もう一度ファイル先頭から読み直しをしたいのですが、うまくいきません。どうすれば、読み直しができるのでしょうか? 処理の流れは次のようにしました。 void CDispDoc::Serialize(CArchive& ar) { CString line; if (ar.IsStoring()) { } else { while(ar.ReadString (line)) {   何かの処理  } //whileを出たところでファイル先頭からの読み直しをしたい 次の2点を試したのですが、うまくいきません。 (1)ファイルポインタを戻してから入力する。 CFile* fp = ar.GetFile (); fp->SeekToBegin (); ar.ReadString (line);//この方法ではFalseが戻る (2)新たなArchiveオブジェクト作って使う。 CFile theFile(ar.GetFile()->GetFilePath (), CFile::modeRead); CArchive arc(&theFile, CArchive::load); arc.ReadString (line);//この方法では共有違反と言われる ReadStringでは読み直しができないのでしょうか?

  • RAID0に高速で書き込む方法

    VC++を使って、Windows2000,XPのプログラムを作成しています。 現在、1秒間に70MB程度のデータを書き込む必要があり、RAID0を使っているのですが、RAID0を使っていない、普通のハードディスクの方が書き込みが早いです。 方法としては、 CFile::SetLengthでファイルの大きさを決めて CFile::Writeで書き込んでいます。 RAID0に高速書き込みする方法があれば、教えてください。よろしくお願いします。

  • VC++でファイルのオブジェクト

    VC++のMFCダイアログベースでプログラミングをしているのですが、ファイルI/Oに関して教えていただけないでしょうか。 現在、CFileを使用しています。 CFile f; で宣言したファイルオブジェクトを他の関数へ引き継ぐにはどうすればいいのでしょうか。 プログラム構造はマルチスレッドになっております。 うまく説明できないのですが、なにか助言をいただけないでしょうか。よろしくお願いします。

  • C#のファイル読み込みについて

    Visual C#を使用したプログラムを勉強中です。 今まではCOBOLでの開発しか、経験したことがありません つい先日から勉強を始め、現在ドリル式の参考書を読み終え 各種コントロール、コンポーネント、ダイアログなども ごく簡単なサンプルプログラムを使用して触ってみました。 つぎのステップとして、自作のプログラムを作成してみようと 考えていたのですが、最初の段階で躓いてしまったので 質問させていただきます。 仕様としては、csvファイルにて 「番号,名前,値1,値2,値3」というデータファイルを作成しておき それをアプリケーション起動時に読み込む TextBoxに文字を入力し、検索ボタンを押すことで データファイルの「名前」部分と一致したデータの内容(値1,値2...)を Label、もしくはTextBoxの指定した箇所にそれぞれ表示をさせようと考えています。 こういった仕様のプログラム(というより、C#での考え方)の場合 最初のデータ読み込みの段階で、csvファイルから配列にデータを 読み込んでおくのか、 検索ボタンを押した段階でファイルから読み込み該当項目を探すのか どちらが良いのでしょうか? データ件数が膨大な量でない限り、前者の方法が適しているのではないかとは 考えています。 また、よろしければ簡単にプログラムでの書き方も 併せて教えていただけると、とてもありがたいです・・・ 今現在のスキルとしては、ファイルの読み込みに関してはopenFileDialogを使用して ファイルを指定し、FileStreamを取得、streamReaderで読み込み richTextBoxに表示させる、というような処理しか理解できていません

  • c/c++でのファイル読み込みについて

    C/C++で、現在勉強をしていますが、csvファイル形式で 作成したファイル(仮に30件ほど)を読み込んだ後、特定のファイル 1件分のみを指定して削除をしたいコードを作成しようと思っています。 どのようなコードを記述してよいか教えてください。

  • CFileのReadでの例外エラー#38が発生

    お世話になります。 Visual Studio2005にてC++のプログラムを作成しており、プログラム内で作成したcsvファイルをプログラム起動時に読み込むような動作を行っております。 そこで、件名のとおりの症状が発生しております。 具体的な症状としましては、csvファイルをCFileのメンバ関数Read()で読み出しているのですが、ファイル内の特定の箇所を読み出そうとしたときに、例外エラーが発生し、エラー番号を確認したところCFileException::m_IOsErrorが”38”となっていました。 ネットで調べたところ、エラー番号38はEOFエラーらしいのですが、普通EOFが見つかったのであればCFile::Read()の場合例外エラーは発生しないかと思います。また、msdnで調べたところファイルを非同期で読み込んだ場合には発生するような事が記載されておりましたが、CFile::Open時に非同期指定にはしておらずデフォルトの指定でファイルを開いております。 また、件のcsvファイルをOS上でコピー&ペーストをしようとすると、「エラー番号38により、データがコピーができない」といった警告文が表示され、コピーすることも出来ません。 このcsvファイルが破損した為なのかな?とは思っているのですが、そのはっきりした原因がわからずどうしたものかとはまっております。 もし同じ症状にあわれた方、対処方法をご存じの方がいらっしゃいましたら、情報を提供頂ければと思っております。 よろしくお願い致します。 開発環境) Windows CE 6.0 Visual Studio 2005

  • ファイルの読み込みと置き換え

    Perlでテキストファイルを読み込み、テキストの一部を置き換えをするというプログラムを作っています。 用意されているテキストファイルは複数行あるもので、リスト作成ツールのフリーソフトにより作成されています。 目的はファイルを読み込み、一行一行中を見て特定の文字を置き換えて、最後に配列に一行一行いれていくというものです。 逆に配列に一度いれて一個一個置き換えてもOKで、結果が同じならばOKです。 以下にそのプログラムを書きます。 ############################## open(IN,"list.txt") || die "ファイルが見つからないので終了します。"; @file = <IN>; $count=@file; while(<IN>){ $_=~s/xls/エクセルファイル/; print "置き換え中!残りあと$count行です\n"; $count-- } close(IN); print"@file[18]","\n"; ############################## 最後の行で置き換えが成功したか見てますが、これを実行しても何も表示されません。 もちろん行数は18行どころか100行くらいあります。 たぶん配列の入れるタイミングとか何かが間違っていると思うのですが、どこで間違っているのかがよくわかりません。 教えていただけると助かります。

    • ベストアンサー
    • Perl
  • CSVファイルの内容をまとめて表示するには

    現在CSVの内容をまとめて表示する方法を思考しています。 例えば(data.csv) ========================= [ID][名前][好きなページURL] [01][山田][http://yahoo.co.jp] [02][鈴木][http://google.co.jp] [03][山田][http://www.goo.ne.jp] [04][加藤][http://google.co.jp] [05][武田][http://yahoo.co.jp] ・ ・ ・ ============= 各項目はカンマ区切りのcsvファイルです。 このCSVファイルを下記のようにまとめて表示する方法を検討しています。 <集計結果表示> 書き込み件数 山田:2件 鈴木:1件 加藤:1件 武田:1件 <好きなURL集計結果> http://yahoo.co.jp = 2件 http://google.co.jp = 2件 http://www.goo.ne.jp = 1件 =========================-- といった具合です。 自分で考えたプログラムを下記に記載します。 <?PHP $Data = file("data.csv"); for($i=0;$i<sizeof($Data);$i++){ $line = explode(",",$Data[$i]); list($id,$name,$url) = $line; ここに名前の集計ができるプログラムを考えています。ここがわからず悩んでいます。 } echo "書き込み件数:{$n}件" ?> 名前の集計の方法がわかればURLの集計も同様の方法で解決が可能だと思うのです。 大変恐縮ですが、お教えいただけないでしょうか。 宜しくお願いいたします。

    • ベストアンサー
    • PHP
  • csvファイルについて

    javaで、csvファイルを読み取り、データベースにいれるツールを作成しています。 csvファイルを読み込む部分でつまづいてしまったので、どなたかご教授ください! 指定されたcsvファイルを一行ずつ取り込むのですが、一つの情報が2行以上になってしまうデータがいくつかあり、ファイルチェックとして、1つ目のカラムは何文字のものだとかしているけれども、その前の行の続きに当たる行が、その条件から外れてしまい、エラーになってしまいます。(当たり前ですが、、、) なぜ、csvファイルが一行に収まらないのかが、わかずですし、それを一行として読み込むことができるのかが不明で困っております。   原因や対処法が分かれば、教えていただければと思います。 よろしくお願いします。

専門家に質問してみよう