gpt4 book ai didi

c# - 读取 JSON 文件中的百万个字符时出现异常 [OutOfMemoryException]

转载 作者:太空狗 更新时间:2023-10-30 01:31:21 27 4
gpt4 key购买 nike

我已经下载了从 Azure Blob 存储记录的 JSON 文件。文件大小为 137MB。

使用Notepad++打开时的字符和线条属性如下图所示: enter image description here

当我从文件上下文菜单中选择“使用 Notepad++ 编辑”时,大约需要 1-2 秒。因此,我决定创建一个程序来将 JSON 转换器转换为 CSV 文件格式。但似乎,我遇到了某种异常(exception)。目前,为了查看 JSON 内容,我将在 RichTextBox 中显示,因为它可以在我决定转换为 CSV 之前查看内容。

开始加载的事件:-

private async void txtjsonname_DoubleClick(object sender, EventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "JSON Files (*.json)|*.json";
ofd.InitialDirectory = @"C:\";
ofd.Title = "Select single json file to be converted";
ofd.Multiselect = false;
if (ofd.ShowDialog() == DialogResult.OK)
{
rtbstat.Text = null;
txtcsvname.Text = null;
txtjsonname.Text = null;
lblcsvpath.Text = null;
lbljsonpath.Text = null;
rtbjson.Clear();
txtjsonname.Text = Path.GetFileName(ofd.FileName);
lbljsonpath.Text = Path.GetDirectoryName(ofd.FileName);

if (await LoadJSONtoRTB(ofd.FileName))
{
rtbjson.WordWrap = false;
rtbstat.Text = "Load file finished! " + (rtbjson.Lines.Count()).ToString() + " line(s) detected | " + rtbjson.Text.Length.ToString() + " character(s) detected";
txtcsvname.Text = Path.GetFileNameWithoutExtension(ofd.FileName) + ".csv";
}
}
await Task.Delay(1000);
}

我尝试并面临异常的代码:-

第一种方法:第一个代码:

private async Task<bool> LoadJSONtoRTB(string path)
{
try
{
foreach (var line in File.ReadLines(path))
{
rtbjson.Text = line;
}
await Task.Delay(10);
return true;
}
catch (Exception)
{
return false;
}
}

第二个代码:

private async Task<bool> LoadJSONtoRTB(string path)
{
try
{
using (FileStream fs = File.Open(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
using (BufferedStream bs = new BufferedStream(fs))
using (StreamReader sr = new StreamReader(bs))
{
string line;
while ((line = sr.ReadLine()) != null)
{
rtbjson.AppendText(line);
}
}
await Task.Delay(10);
return true;
}
catch (Exception)
{
return false;
}
}

enter image description here异常:System.Windows.Forms.dll 中发生“System.AccessViolationException”类型的未处理异常

附加信息:尝试读取或写入 protected 内存。这通常表明其他内存已损坏。

第二种方法:-

private async Task<bool> LoadJSONtoRTB(string path)
{
try
{
StreamReader sr = new StreamReader(@path);
while (!sr.EndOfStream)
rtbjson.Text += sr.ReadLine();
await Task.Delay(10);
return true;
}
catch (Exception)
{
return false;
}
}

使用上面的代码,当我设置断点以查看进度时,它运行了大约 12 分钟。 enter image description here

12 分钟,阅读量达 600 万次。

有没有办法像notepad++一样显示长度为6400万字符的文本文件(json/txt),只需1-2秒即可查看该文件?

最佳答案

我怀疑 Notepad++ 使用相当于 System.IO.File.ReadAllText 的内容将整个文件加载到内存中。另外,将文件的每一行附加到字符串中没有任何好处,最终结果是占用相同的内存。使用 RichTextBox,您可以做的最好的事情是:

richTextBox1.Text = System.IO.File.ReadAllText(filePath);

无论如何,Notepad++ 使用 Scintilla这比 RichTextBox 更快。

您可以尝试使用ScintillaNET这是 Scintilla 的包装。

您可以按照与 RichTextBox 相同的方式设置控件文本:

scintilla1.Text = System.IO.File.ReadAllText(filePath);

关于c# - 读取 JSON 文件中的百万个字符时出现异常 [OutOfMemoryException],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41759858/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com