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

13 浏览
0 Comments

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

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

  • 文件内容既不应完全是随机的,也不应完全是均匀的。

    全零的二进制文件不行。完全随机的二进制文件也不行。对于文本文件,完全随机的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重复将其写入文本文件中。内容是非随机和非均匀的,但是它包含许多相同的重复块,这是不自然的。此外,由于Lorem Ipsum块非常小(<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更快的写入文本文件的方法?

有什么建议吗?

编辑:我喜欢使用马尔可夫链来生成更自然的文本。不过还需要解决速度的问题。

0
0 Comments

在这个问题中,提问者想要快速创建大于1GB的文本+二进制文件,并且希望内容具有“自然”的特点。下面是解决这个问题的几种方法:

1. 对于文本部分,可以使用Stack Overflow社区的数据转储,有300兆字节的数据。可以使用提问者编写的应用程序将其加载到数据库中只需要大约6分钟的时间,然后将所有帖子转储为文本文件可能需要大约相同的时间。这样可以轻松获得20万到100万个文本文件,具体取决于您的方法(还有额外的好处是源代码和XML混合在一起)。

2. 还可以使用维基百科的数据转储,它似乎以MySQL格式提供,这样处理起来非常容易。

3. 如果您正在寻找一个可以分割的大文件,用于二进制目的,可以使用虚拟机的vmdk文件或从DVD上自行提取。

编辑部分:提问者提到了古登堡计划的下载,这也是一个非常好的文本(和音频)来源,可以通过BitTorrent下载。

还可以考虑古登堡计划,大部分纯文本文件已经被压缩,所以下载速度很快。

已经有一个压缩基准测试使用了维基百科的一部分转储数据。

要快速创建大于1GB的文本+二进制文件,并且内容具有“自然”特点,可以使用Stack Overflow社区转储、维基百科转储、古登堡计划等数据源,具体取决于您的需求和偏好。

0
0 Comments

问题的原因是作者需要快速创建大型的文本+二进制文件,并且这些文件内容需要具有“自然”的特点。作者已经发现了一个使用马尔可夫链生成数据的方法,这种方法既是随机的,又是结构化的。马尔可夫链已经被用于生成类似于人类语言的半真实文本。作者建议设计一个通用的马尔可夫过程框架,并根据需要的随机数据类型(自然语言或源代码)对其进行“训练”。最后,这将得到符合要求的高质量数据。虽然如今8GB的数据可能不再是巨大的,但从计算和I/O时间的角度来看,它仍然是显著的。作者发现了一个实现马尔可夫链的C#代码,它的性能非常好。

0
0 Comments

问题的原因是问题提出者想要快速创建大于1GB的文本+二进制文件,并且希望这些文件内容是“自然”的。然而,该问题提供的方法目前花费的时间太长,因此,问题提出者希望找到更快的解决方法。

解决方法是使用一个小型的网络爬虫来获取数据。通过下载8GB的内容,可以获取到最接近“自然”的数据,而且还可以下载图片。然而,这种方法并不快速。虽然可以使用多线程来加快下载速度,但是仍然需要很长时间。因此,一个更好的解决方法可能是使用机器学习的方法。

总结起来,问题的原因是问题提出者想要快速创建大型的文本+二进制文件,但目前的方法花费的时间太长。解决方法是使用一个小型的网络爬虫来获取数据,虽然这种方法不够快速,但是可以获取到最接近“自然”的数据。另外,还提到了使用多线程和机器学习的方法来加快速度。

0