如何使用指定大小的垃圾数据更高效地创建大文件

本文关键字:高效 数据 文件 创建 何使用 | 更新日期: 2023-09-27 18:21:54

我想做的是编写一个程序,它可以生成充满随机垃圾的大文件(1GB及以上)。

问题是,如果我试图创建一个大于100MB的文件,我的应用程序将使用超过500MB的Ram,并且永远占用。

我使用的步骤:

  • 使用循环生成垃圾数据并将其添加到字符数组中
  • 将数组中的所有字符存储到变量中
  • 将变量中的数据保存到文件中

有什么更好的解决方案吗?也许有捷径?

这就是我正在使用的:

namespace Fake_File_Creator
{
    public partial class MainWindow : Form
    {
        private string text;
        private List<char> stringChars;
        public MainWindow()
        {
            InitializeComponent();
        }
        private void btnNewFile_Click(object sender, EventArgs e)
        {
            sfdNewFile.Filter = "All Files|*.*";
            if (sfdNewFile.ShowDialog() == DialogResult.OK)
            {
                lblMessage.Text = "Generating data...";
                bwCreateData.RunWorkerAsync((int)nudSize.Value * 1024000);
            }
        }
        private void bwCreateData_DoWork(object sender, DoWorkEventArgs e)
        {
            var random = new Random();
            var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz 0123456789 ~!@#$%^&*()_+ /.,'[];{}|:<>?";
            stringChars = new List<char>();
            for (int i = 0; i < (int)e.Argument; i++)
            {
                stringChars.Add(chars[random.Next(chars.Length)]);
            }
            text = new string(stringChars.ToArray());
        }
        void bwCreateData_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            lblMessage.Text = "Saving file...";
            bwCreateFile.RunWorkerAsync();
        }
        private void bwCreateFile_DoWork(object sender, DoWorkEventArgs e)
        {
            using (StreamWriter outfile = new StreamWriter(sfdNewFile.FileName))
            {
                outfile.Write(text);
            }
        }
        void bwCreateFile_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            lblMessage.Text = "File succesfully created...";
            text = string.Empty;
            stringChars.Clear();
            stringChars = null;
            GC.Collect(); 
        }
    }
}

如何使用指定大小的垃圾数据更高效地创建大文件

只需直接向文件中写入大量数据,而不是以字符串"text"的形式保存到内存中。

你可以叫outfile。循环写入("垃圾邮件")。

通过预分配列表可能会有所帮助

stringChars = new List<char>((int)e.Argument);

这组字符重要吗?您可以尝试生成一个介于1和94之间的随机数(大约),添加31并转换为ASCII字符。您将以这种方式获得大部分可打印的ascii集,并将查找保存在chars数组中。

编辑。。。我同意前面的海报(James Cotter)——既然你可以做,为什么还要写信给你的临时阵列

streamWriter.Write(randomCharacter)