如何快速创建大(>;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)李>
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的随机文本,然后重复获取该文本的随机段,并将其全局化