出于测试压缩的目的,我需要能够创建大文件,最好是文本、二进制和混合格式。
- 文件的内容既不能完全随机也不能统一。
全为零的二进制文件是不好的。具有完全随机数据的二进制文件也不好。对于文本,具有完全随机 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();
}
有了足够大的缓冲区,比方说 512k,这相对较快,即使对于超过 2 或 3gb 的文件也是如此。但是内容完全是随机的,这不是我想要的。
对于文本文件,我采用的方法是使用Lorem Ipsum ,并通过 StreamWriter 将其重复发送到文本文件中。内容是非随机的、不均匀的,但它确实有很多相同的重复 block ,这是不自然的。此外,由于 Lorem Ispum block 非常小(<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 更快的写入文本文件的方法?
建议?
编辑:我喜欢用马尔可夫链产生更自然文本的想法。不过,仍然需要面对速度问题。
最佳答案
对于文本,您可以使用 stack overflow community dump ,那里有 300 兆的数据。使用我编写的应用程序加载到数据库中只需要大约 6 分钟,并且可能大约在同一时间将所有帖子转储到文本文件,这很容易为您提供 200K 到 100 万个文本文件,具体取决于您的方法(混合了源代码和 xml 的额外好处)。
您也可以使用类似 wikipedia dump 的东西,它似乎以 MySQL 格式发布,这将使它非常容易使用。
如果您正在寻找可以分割的大文件,出于二进制目的,您可以使用 VM vmdk 或本地翻录的 DVD。
编辑
Mark 提到项目 gutenberg 下载,这也是一个非常好的文本(和音频)来源,可用于 download via bittorrent .
关于c# - 如何快速创建内容为 "natural"的大型 (>1gb) 文本+二进制文件? (C#),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1037719/