2017-12-20 35 views
1

私はopenMPを使ってディスクからたくさんの行を含む大きなファイルを読みたいと思っています。それを行う1つの方法は、seekg()機能を使用するようです。しかし、頭痛の部分はseekg()のみで、ファイルインデックスを特定のバイトに移動することができます。C++ファイルごとに各行を揃える方法は?

これは、各行のサイズがまったく同じ場合は問題ありません。しかし、私は、各行のサイズがまったく違うなら、それをどうやって行うのか分かりません。 あなたは私にいくつかのヒントを与えることができますか?

答えて

1

一つの可能​​性:終末をラインに関係なく

  • 分割バイト、各並列タスクのいずれかに基づいて同じサイズのチャンクにファイル、。
  • 各タスクがチャンクの先頭にシークしてから、を読み込み、文字を無視して、行の終わりでファイルの処理を開始できるようにします。 (特別なケースとして、オフセット0で始まるタスクは既に行の先頭にあるので、これをしてはいけません)
  • タスクがそのチャンクの終わりに達すると、次のチャンク開始)、現在の行の末尾にその点を読み取っています。 (特殊なケースとして、最後のチャンクの終わりもファイルの終わりであるため、そのポイントを超えて読むことはありません)。

基本的には、最初にバイトオフセットに基づいて境界を選択してから移動しますそれらは行末と一致するように前方に移動します。各タスクはそのチャンクの先頭でいくつかの文字をスキップし、その文字はその代わりに前のチャンクの終わりを過ぎて読み取る別のタスクによって処理されます。

(私はこれはHadoopのはところで、デフォルトではテキストベースの入力ファイルを分割する方法であると信じています。)

+0

は〜私はディスクにバイトの代わりの文字列を保存するためのコードを修正していただきありがとうございます。そして、それは動作します! – uniqueliu

+0

ファイルは常にバイトを保持しているので、文字列の代わりにバイトを保存することは何を意味するのかははっきりしません。しかし、1つの誤解を避けるために:私がファイルを複数の塊に分割すると言いましたが、それを物理的に小さなファイルに分割する必要はありません。すべてのテキストを1つのファイルに保存できますが、タスク内で均等に配置された位置を選択するだけです。 – Wyzard

+0

もう1つのことを確認してください:タスクが1行終了することなくタスクのチャンクの終わりに達した場合は、テキストをまったく処理しないで停止する必要があります。つまり、3つ以上のチャンクにまたがる長い行があり、途中のチャンクを見ているタスクは、その行または次の行の先頭を見ることができないため、行う。 – Wyzard

関連する問題