如何快速创建大(>;1gb)文本&x2B;带“0”的二进制文件;“天然的”;内容?(C#)

如何快速创建大(>;1gb)文本&x2B;带“0”的二进制文件;“天然的”;内容?(C#),c#,.net,windows,testing,filesystems,C#,.net,Windows,Testing,Filesystems,为了测试压缩,我需要能够创建大文件,最好是文本、二进制和混合格式 文件的内容既不能完全随机,也不能完全统一。 一个全是零的二进制文件是不好的。完全随机数据的二进制文件也不好。对于文本,一个包含完全随机ASCII序列的文件是不好的-文本文件应该具有模拟自然语言或源代码(XML、C#等)的模式和频率。伪真实文本 每个文件的大小并不重要,但对于文件集,我需要的总大小为~8gb 我希望将文件的数量保持在一个可管理的水平,比如o(10) 为了创建二进制文件,我可以新建一个大缓冲区,然后执行System

为了测试压缩,我需要能够创建大文件,最好是文本、二进制和混合格式

  • 文件的内容既不能完全随机,也不能完全统一。
    一个全是零的二进制文件是不好的。完全随机数据的二进制文件也不好。对于文本,一个包含完全随机ASCII序列的文件是不好的-文本文件应该具有模拟自然语言或源代码(XML、C#等)的模式和频率。伪真实文本
  • 每个文件的大小并不重要,但对于文件集,我需要的总大小为~8gb
  • 我希望将文件的数量保持在一个可管理的水平,比如o(10)
为了创建二进制文件,我可以新建一个大缓冲区,然后执行System.Random.NextBytes,然后执行FileStream.Write in循环,如下所示:

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),即使对于超过2或3gb的文件,速度也相对较快。但是内容完全是随机的,这不是我想要的


对于文本文件,我所采取的方法是使用,并通过StreamWriter将其反复发送到文本文件中。内容是非随机和非均匀的,但它确实有许多相同的重复块,这是不自然的。另外,因为Lorem Ispum块非常小(你可以给自己编写一个小的网络爬虫

更新 冷静点,伙计们,这将是一个很好的答案,如果他没有说他已经有了一个“需要太长时间”的解决方案的话


快速检查似乎表明,下载8GB的任何内容都需要相对较长的时间。

我认为您可能正在寻找一种类似于生成此数据的过程。它既随机(随机),又结构化,因为它是基于一个


事实上,马尔可夫链已被用于生成人类语言中的半现实文本。一般来说,它们不是需要正确分析的琐碎事物,但它们表现出某些属性的事实对您来说应该足够好了。(同样,请参阅本页的第节。)希望您能看到如何设计一个,然而,要实现它,它实际上是一个非常简单的概念。您最好的选择可能是为通用马尔可夫过程创建一个框架,然后分析自然语言或源代码(无论您希望随机数据模拟哪个),以便“训练”你的马尔可夫过程。最终,根据你的需求,这将为你提供非常高质量的数据。如果你需要这些巨大长度的测试数据,那么值得付出努力。

对于文本,你可以使用,那里有300兆格的数据。用我编写的应用程序加载到数据库只需要大约6分钟,可能大约在将所有帖子转储到文本文件的同时,根据您的方法,您可以轻松地获得20万到100万个文本文件(另外还可以将源代码和xml混合在一起)

您还可以使用类似的东西,它似乎是以MySQL格式发布的,这将使它非常易于使用

如果您正在寻找一个可以拆分的大文件,出于二进制目的,您可以使用VM vmdk或本地刻录的DVD

编辑


马克提到古腾堡项目下载,这也是一个非常好的文本(和音频)来源对于文本文件,您可能会成功地从中随机抽取单词。这不会生成真正的英语文本,但我猜它会生成与您在英语中可能找到的字母频率相似的字母频率


对于更结构化的方法,您可以使用经过培训的大型免费英文文本。

为什么不在输出之前使用Lorem Ipsum并在内存中创建一个长字符串。文本应以O(log n)的速率扩展如果每次的文本量增加一倍,甚至可以事先计算数据的总长度,这样就不必将内容复制到新的字符串/数组


由于您的缓冲区只有512k或您将其设置为的任何值,因此您只需在写入之前生成那么多数据,因为这只是您一次可以推送到文件中的数据量。您将一遍又一遍地写入相同的文本,所以只需使用您第一次创建的原始512k即可。

我认为Windows是可怕的对于您的需要,ctory可能是一个足够好的源代码。如果您在查找文本,我会在每个目录中递归查找.txt文件,并循环查找它们,根据需要将它们复制到输出文件中,以获得正确大小的文件


然后,您可以通过查找.exes或.dll来对二进制文件使用类似的方法。

Wikipedia非常适合对混合文本和二进制文件进行压缩测试。如果您需要基准比较,可以为Wikipedia的前100mb提供一个高水位线。当前记录的比率为6.26,16MB。

感谢您的快速测试输入。 我决定单独考虑速度和“自然”的问题。为了生成自然的文本,我结合了一些想法。

  • 为了生成文本,我从目录中的一些文本文件开始,正如马克·拉沙科夫所建议的那样
  • 我随机选择并下载该子集中的一个文档
  • 然后我应用马尔可夫过程,例如,使用下载的文本作为输入
  • 我以C#为例编写了一个新的马尔可夫链,它一次生成一个单词的文本
  • 为了提高效率,该代码不是使用纯马尔可夫链一次生成1gb的文本,而是生成一个~1mb的随机文本,然后重复获取该文本的随机段,并将其全局化
更新:至于第二个问题,spe