如何更有效地创建具有指定大小的垃圾数据的大文件?

时间:2012-01-31 09:05:26

标签: c# winforms performance backgroundworker

我想要做的是编写一个可以生成大型文件(1GB及以上)的程序,其中包含的内容不会少于随机垃圾。

问题在于,如果我尝试创建一个大于100MB的文件,我的应用程序使用的RAM超过500MB,并且需要永远。

我正在使用的步骤:

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

有没有更好的解决方案呢?也许有些捷径?

这就是我正在使用的:

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(); 
        }
    }
}

2 个答案:

答案 0 :(得分:2)

直接将大量数据直接写入文件,而不是以字符串“text”保存到内存中。

您可以在循环中调用outfile.Write(“垃圾文本”)。

答案 1 :(得分:1)

通过

预先分配列表可能会有所帮助
stringChars = new List<char>((int)e.Argument);

字符集是否重要?您可以尝试生成1到94之间的随机数(或左右),添加31并转换为ASCII char。你将获得大部分可打印的ascii设置,并在chars数组中保存查找。

编辑 ...我同意上一张海报(James Cotter) - 为什么在你可以做的时候写你的临时阵列

streamWriter.Write(randomCharacter)