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

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

C# と VB.NET の入門サイト

C++ での大きいファイルの読み込み方

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■86946 / inTopicNo.1)  C++ での大きいファイルの読み込み方
  
□投稿者/ のぶくん (1回)-(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 の構造体を保持

という手順が思いついていますが、上記にも書いた通り、ループ数が多いので悩んでいます。

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

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

Visual Studio 2017 コミュニティ
C++(MFC は使用していません)
Windows10(ターゲットはWin7以上)
引用返信 編集キー/
■86949 / inTopicNo.3)  Re[1]: C++ での大きいファイルの読み込み方
□投稿者/ 774RR (600回)-(2018/04/05(Thu) 10:45:05)
発言内容から案件がうまく読み取れないんだけど

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

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

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

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


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

なるほど。やはり、地道にループ処理をかけていきます。
ありがとうございました。
引用返信 編集キー/
■86953 / inTopicNo.5)  Re[2]: C++ での大きいファイルの読み込み方
□投稿者/ のぶくん (4回)-(2018/04/05(Thu) 11:26:00)
解決忘れ。
解決済み
引用返信 編集キー/
■86956 / inTopicNo.6)  Re[3]: C++ での大きいファイルの読み込み方
□投稿者/ 774RR (601回)-(2018/04/05(Thu) 12:57:44)
解決後だけど、真にデータが数億個もあるんだったら「データベース」の出番だろう。
単にメモリに読んで終わり、ってことは普通ないはずで、それから検索とか修正とかすることになりそうだし
それなら postgresql なり mysql なり sqlserver なり使うほうが順当なのでは。
(まあ既にデータファイルになっちゃってるんだったら手遅れなんだけど)
検討してみる価値はあると思うよ。
解決済み
引用返信 編集キー/
■86960 / inTopicNo.7)  Re[4]: C++ での大きいファイルの読み込み方
□投稿者/ なちゃ (241回)-(2018/04/05(Thu) 15:27:45)
すでに言われてる話ですが、数十億ものデータ数の可能性があるとしたら、メモリ上で30バイトきっかりで計算しても1000億バイトとかのデータになる可能性があるわけで、そのまま読み込んで処理すること自体がそもそも非現実的なわけです。
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ