c# - 如何快速创建内容为 "natural"的大型 (>1gb) 文本+二进制文件? (C#)

标签 c# .net windows testing filesystems

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

  • 文件的内容既不能完全随机也不能统一。
    全为零的二进制文件是不好的。具有完全随机数据的二进制文件也不好。对于文本,具有完全随机 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/

相关文章:

c# - 正则表达式仅匹配整数

c# - 在 StackExchange.Redis 中执行搜索

C# HTTP GET 请求返回隐藏字符

windows - 如何在 Windows 上从命令提示符更新 golang?

ruby - 如何在 ruby​​ 中处理文件时同时运行多个线程?

c# - 如何以编程方式将最小化的无模式 WinForm 带到其先前显示的位置?

c# - 通过 StreamWriter 或文件写入修改数据?

.net - 自定义 .NET 序列化似乎不起作用

c# - 删除文件夹的内容而不是文件夹本身?

windows - 批处理文件抛出错误但是当每个命令在命令行中单独运行时它工作正常