圧縮をテストするためには、理想的にはテキスト、バイナリ、および混合形式の大きなファイルを作成できる必要があります。「自然」の内容の大きなテキスト(1GB以上)とバイナリファイルをすばやく作成するにはどうすればよいですか? (C#)
- ファイルの内容は完全にランダムでも均一でもないはずです。
すべて0のバイナリファイルはいいです。全くランダムなデータを持つバイナリファイルも良くありません。テキストの場合、完全にランダムなASCIIシーケンスのファイルは良くありません。テキストファイルには、自然言語やソースコード(XML、C#など)をシミュレートするパターンと頻度が必要です。疑似実テキスト - 個々のファイルのサイズは重要ではありませんが、ファイルのセットでは合計が〜8GBである必要があります。
- ファイルの数を管理可能なレベルに保ちたいと思います.O(10)としましょう。
バイナリファイルを作成するために、私は大きなバッファを新たにし、ループ内でFileStream.Write続いSystem.Random.NextBytesを行い、このようなことができます。
Int64 bytesRemaining = size;
byte[] buffer = new byte[sz];
using (Stream fileStream = new FileStream(Filename, FileMode.Create, FileAccess.Write))
{
while (bytesRemaining > 0)
{
int sizeOfChunkToWrite = (bytesRemaining > buffer.Length) ? buffer.Length : (int)bytesRemaining;
if (!zeroes) _rnd.NextBytes(buffer);
fileStream.Write(buffer, 0, sizeOfChunkToWrite);
bytesRemaining -= sizeOfChunkToWrite;
}
fileStream.Close();
}
十分な大きさのバッファでは、聞かせての512kと言うと、2GBや3GBを超えるファイルの場合でも比較的高速です。しかし、コンテンツは完全にランダムです。これは私が望むものではありません。
テキストファイルの場合は、Lorem Ipsumを使用して、StreamWriter経由で繰り返しテキストファイルに出力します。内容は非ランダムかつ不均一であるが、多くの同一の反復ブロックがあり、これは不自然である。また、Lorem Ispumブロックは非常に小さく(< 1k)、多くのループと非常に長い時間がかかります。
どちらも私にとってはまったく問題ありません。
私はQuickly create large file on a windows system?の回答を見ました。これらのアプローチは非常に高速ですが、私はファイルをゼロまたはランダムなデータで埋め尽くしていると思います。どちらも、私が望むものではありません。私は必要に応じてcontigやfsutilのような外部プロセスを実行することに問題はありません。
テストはWindowsで実行されます。
新しいファイルを作成するのではなく、ファイルシステムにすでに存在するファイルを使用する方が理にかなっていますか?私は十分に大きいものは分かりません。
既存のファイル(テキストファイルの場合はc:\ windows \ Microsoft.NET \ Framework \ v2.0.50727 \ Config \ enterprisesec.config.cchなど)から開始し、何度もコンテンツを複製するのはどうですか?これは、テキストファイルまたはバイナリファイルで動作します。
現在、私は仕事の種類はありますが、実行には時間がかかります。
他に誰かがこれを解決しましたか?
StreamWriterを使用するよりもはるかに高速にテキストファイルを書き込むことはできますか?
提案?
EDIT:私はより自然なテキストを生成するためにマルコフチェーンという考えが好きです。しかし、スピードの問題にまだ対処する必要があります。
どのような種類のバイナリデータをシミュレーション(画像)しようとしていますか? –
画像に重点を置いていませんが、私はほとんどの画像フォーマットがあらかじめ圧縮されていると思います。データベースファイルやその他のバイナリデータフィードの方が重視されます。 – Cheeso
完全なソースコードを含む最終的なソリューションのサンプル? – Kiquenet