如何使用指定大小的垃圾数据更高效地创建大文件
本文关键字:高效 数据 文件 创建 何使用 | 更新日期: 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)