C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.86946 の関連記事表示

<< 0 >>
■86946  C++ での大きいファイルの読み込み方
□投稿者/ のぶくん -(2018/04/05(Thu) 10:23:36)

    分類:[C/C++] 

    C++を使い、大きいファイルを読み込もうとしています。
    しかし、そのファイルの仕様上、決められた構造体をループによって取得するとなると、
    数千万回〜数億回のループ処理が必要になります。(可能性として数十億回のループ処理もあり得る)
    そこで、この取得する部分を単純な while や for によらず高速に処理できる方法はないものかと思い質問しました。

    ファイルの仕様についてはおおよそ以下のような形です。

    ================
    ----
    File Header (50bytes) // 不要 捨てる部分
    ----
    Bolck Header #1 (10bytes) // 不要
    ----
    Data #1 (30bytes) // ここのデータのみ欲しい
    ----
    Block Header #2
    ----
    Data #2

    ... 以下 Block Header と Data の繰り返し
    ================

    一応、コードとして書けていませんが、
    1. ifstream で開き、不要な 50bytes 分進める
    2. Block Header と Data を含んだ構造体で EOF になるまで読み込み
    3. vector あたりに 2 の構造体を保持

    という手順が思いついていますが、上記にも書いた通り、ループ数が多いので悩んでいます。
親記事 /過去ログ149より / 関連記事表示
削除チェック/

■86949  Re[1]: C++ での大きいファイルの読み込み方
□投稿者/ 774RR -(2018/04/05(Thu) 10:45:05)
    発言内容から案件がうまく読み取れないんだけど

    Data#1 だけが必要なんだったらループなんか必要ない
    Header は捨てて Data だけ欲しいつまり Data#1 Data#2 Data#3 のように読みたいのならループは必要
    それだけのことなのに、なぜ数億回のループになりえるのかよくわからない。

    データが数億個あるのなら数億回のループになるのは必然なので
    (あなたの自作コード上にループが明示されてなくても、使うライブラリ関数内部でループする)
    数億回というのが「本当に必要な処理」なのだったら削減できないわけですな。
記事No.86946 のレス /過去ログ149より / 関連記事表示
削除チェック/

■86952  Re[2]: C++ での大きいファイルの読み込み方
□投稿者/ のぶくん -(2018/04/05(Thu) 11:25:33)
    No86949 (774RR さん) に返信
    > 発言内容から案件がうまく読み取れないんだけど
    >
    > Data#1 だけが必要なんだったらループなんか必要ない
    > Header は捨てて Data だけ欲しいつまり Data#1 Data#2 Data#3 のように読みたいのならループは必要
    > それだけのことなのに、なぜ数億回のループになりえるのかよくわからない。

    申し訳ありません。書き方が非常に下手でした。
    Data 部が欲しいので、「#1 のみだけ取得できれば」ではなく、ファイル内にある Data 部すべてを取得したいという事でした。


    > データが数億個あるのなら数億回のループになるのは必然なので
    > (あなたの自作コード上にループが明示されてなくても、使うライブラリ関数内部でループする)
    > 数億回というのが「本当に必要な処理」なのだったら削減できないわけですな。

    なるほど。やはり、地道にループ処理をかけていきます。
    ありがとうございました。
記事No.86946 のレス /過去ログ149より / 関連記事表示
削除チェック/

■86947  Re[1]: C++ での大きいファイルの読み込み方
□投稿者/ のぶくん -(2018/04/05(Thu) 10:28:36)
    No86946 (のぶくん さん) に返信

    すみません。環境を書き忘れました。

    Visual Studio 2017 コミュニティ
    C++(MFC は使用していません)
    Windows10(ターゲットはWin7以上)
記事No.86946 のレス /過去ログ149より / 関連記事表示
削除チェック/

■86953  Re[2]: C++ での大きいファイルの読み込み方
□投稿者/ のぶくん -(2018/04/05(Thu) 11:26:00)
    解決忘れ。
記事No.86946 のレス / END /過去ログ149より / 関連記事表示
削除チェック/

■86956  Re[3]: C++ での大きいファイルの読み込み方
□投稿者/ 774RR -(2018/04/05(Thu) 12:57:44)
    解決後だけど、真にデータが数億個もあるんだったら「データベース」の出番だろう。
    単にメモリに読んで終わり、ってことは普通ないはずで、それから検索とか修正とかすることになりそうだし
    それなら postgresql なり mysql なり sqlserver なり使うほうが順当なのでは。
    (まあ既にデータファイルになっちゃってるんだったら手遅れなんだけど)
    検討してみる価値はあると思うよ。
記事No.86946 のレス / END /過去ログ149より / 関連記事表示
削除チェック/

■86960  Re[4]: C++ での大きいファイルの読み込み方
□投稿者/ なちゃ -(2018/04/05(Thu) 15:27:45)
    すでに言われてる話ですが、数十億ものデータ数の可能性があるとしたら、メモリ上で30バイトきっかりで計算しても1000億バイトとかのデータになる可能性があるわけで、そのまま読み込んで処理すること自体がそもそも非現実的なわけです。
記事No.86946 のレス / END /過去ログ149より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -