如何快速创建具有"自然"内容的大型(> 1gb)文本+二进制文件?(C#)

Che*_*eso 7 .net c# windows filesystems testing

为了测试压缩,我需要能够创建大文件,理想情况下是文本,二进制和混合格式.

  • 文件的内容既不是完全随机也不是统一的.
    一个全零的二进制文件是不好的.具有完全随机数据的二进制文件也不好.对于文本,具有完全随机的ASCII序列的文件不好 - 文本文件应具有模拟自然语言或源代码(XML,C#等)的模式和频率.伪真实文本.
  • 每个文件的大小并不重要,但对于文件集,我需要的总数大约为8GB.
  • 我想将文件数量保持在可管理的水平,让我们说o(10).

为了创建二进制文件,我可以新建一个大缓冲区并在循环中执行System.Random.NextBytes后跟FileStream.Write,如下所示:

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();
}
Run Code Online (Sandbox Code Playgroud)

使用足够大的缓冲区,比方说512k,这相对较快,即使对于超过2或3gb的文件也是如此.但内容完全是随机的,这不是我想要的.

对于文本文件,我采用的方法是使用Lorem Ipsum,并通过StreamWriter将其重复发送到文本文件中.内容是非随机且不均匀的,但它确实有许多相同的重复块,这是不自然的.此外,由于Lorem Ispum块非常小(<1k),因此需要很多循环并且需要非常长的时间.

这些都不是我满意的.

我已经看到了在Windows系统上快速创建大文件的答案.这些方法非常快,但我认为它们只是用零或随机数据填充文件,这两者都不是我想要的.如果需要,我可以运行像contig或fsutil这样的外部进程.

测试在Windows上运行.
而不是创建新文件,仅使用文件系统中已存在的文件更有意义吗?我不知道任何足够大的东西.

如何从单个现有文件开始(对于文本文件可能是c:\ windows\Microsoft.NET\Framework\v2.0.50727\Config\enterprisesec.config.cch)并多次复制其内容?这适用于文本或二进制文件.

目前我有一种方法可行,但运行时间太长.

有没有人解决过这个问题?

编写文本文件比通过StreamWriter快得多吗?

建议?

编辑:我喜欢马尔可夫链的想法,以产生更自然的文本.但仍需要面对速度问题.

Sam*_*ron 14

对于文本,您可以使用堆栈溢出社区转储,那里有300megs的数据.使用我编写的应用程序加载到数据库只需要大约6分钟,并且可能大约同时将所有帖子转储到文本文件中,这样可以轻松地为您提供200,000到100万个文本文件,具体取决于您的方法(还有将源和xml混合在一起的额外好处).

您也可以使用类似维基百科转储的东西,它似乎以MySQL格式发布,这将使它非常容易使用.

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

编辑

Mark提到了gutenberg下载的项目,这也是一个非常好的文本(和音频)源,可以通过bittorrent下载.

  • 我还想提一下Project Gutenberg.大多数纯文本文件已经过压缩,因此可以快速下载.http://www.gutenberg.org/catalog/ (3认同)

Ben*_*jol 10

您总是可以自己编写一个小型爬虫程序...

更新 冷静下来,这是一个很好的答案,如果他没有说他已经有一个"需要太长时间"的解决方案.

这里的快速检查似乎表明下载8GB的任何东西需要相当长的时间.


Nol*_*rin 4

我认为您可能正在寻找类似马尔可夫链过程的东西来生成这些数据。它既是随机的(随机的),又是结构化的,因为它基于有限状态机运行。

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