2017-12-26 1 views
2

私は、メモリにロードされずにディスク上のファイルをシャッフルするアイデアを探していました。当初、私はそのようなアプローチが存在するかどうかは疑問ですが、最近私はこれを見つけましたanswer。この回答はサポートされていないか、投票されていないので、このコードが本当にメモリにロードせずにファイルをシャッフルするかどうかを知りたいです。もしそうなら、どうすれば起こりますか?私は、ファイルを最初にメモリにロードせずにシャッフルする方法を見ていません!ファイルがメモリにロードされずにディスク上でシャッフルされる方法

+1

カードのデッキをシャッフルするのが好きです。ランダムに順序を変更する –

+1

ファイルをメモリに一切読み込まずにシャッフルすることができます。もちろん、いくつかの部分をメモリに読み込む必要があります。 –

答えて

4

私はあなたがテキストファイル内のラインをシャッフルすることについて話していると仮定します。

Jamie Cockburnのリンクされた回答が機能しているかどうかはわかりませんが、それは私には全く合理的です。アイデアは以下の通りです:

  • mmapがメモリにファイル全体をロードしませんが、それはリストだったかのように、あなたは「から」を経由してインデックス化することによって、そのランダムな部分にアクセスすることを可能にすると、「へ」のバイト、メモリ
  • にロードされたあなたは、ファイルを介して二回行くんが、
  • メモリにファイルを通過まず時間を、ファイルの内容をロードしていない、あなたがラインに気をつけ\nを破壊し、行を格納しないが、各行の開始および終了のアドレスに対応するバイト番号(またはインデックス)。あなたが効果的に
  • あなたは今linesと呼ばれるインデックスのリストシャッフル行ごとに2つの番号を格納
  • は今、あなたは書き込み用に新しいファイルを開いて、シャッフル指数を反復(覚えているが、それだけでペア(int, int)が含まれています)。各インデックスペアについて、元のファイルからメモリに1行のdata[start:end+1]を読み込んで、新しいファイルに書き込みます。あなたはこの一回の操作より長くメモリを保持しません。

このアプローチでは、入力ファイルの行数に直線的なメモリ量が必要です。平均行長が2つの整数を格納するのに必要なメモリ量よりも大きい場合は、ファイル全体を読み取るよりもはるかに小さいことがあります。

+0

はい、私はテキストファイルのラインをシャッフルすることを意味しました。どうもありがとうございました。よく説明された – David

関連する問題