- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我已经下载了从 Azure Blob 存储记录的 JSON 文件。文件大小为 137MB。
当我从文件上下文菜单中选择“使用 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;
}
}
异常: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 分钟。
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/
3-d 中的点由 (x,y,z) 定义。任意两点 (X,Y,Z) 和 (x,y,z) 之间的距离 d 为 d= Sqrt[(X-x)^2 + (Y-y)^2 + (Z-z)^2]。现在一个文件中有一百
我是一名优秀的程序员,十分优秀!