[英]Out of memory exception reading and writing text file
執行以下代碼幾秒鍾后,我收到內存不足異常。 在拋出異常之前它不會寫任何東西。 文本文件的大小約為 0.5 GB。 我正在編寫的文本文件最終將占用大約 3/4 GB 的空間。 有什么技巧可以繞過這個異常嗎? 我認為這是因為文本文件太大。
public static void ToCSV(string fileWRITE, string fileREAD)
{
StreamWriter commas = new StreamWriter(fileWRITE);
var readfile = File.ReadAllLines(fileREAD);
foreach (string y in readfile)
{
string q = (y.Substring(0,15)+","+y.Substring(15,1)+","+y.Substring(16,6)+","+y.Substring(22,6)+ ",NULL,NULL,NULL,NULL");
commas.WriteLine(q);
}
commas.Close();
}
我已將代碼更改為以下代碼,但仍然得到相同的異常?
public static void ToCSV(string fileWRITE, string fileREAD)
{
StreamWriter commas = new StreamWriter(fileWRITE);
using (FileStream fs = File.Open(fileREAD, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
using (BufferedStream bs = new BufferedStream(fs))
using (StreamReader sr = new StreamReader(bs))
{
string y;
while ((y = sr.ReadLine()) != null)
{
string q = (y.Substring(0, 15) + "," + y.Substring(15, 1) + "," + y.Substring(16, 6) + "," + y.Substring(22, 6) + ",NULL,NULL,NULL,NULL");
commas.WriteLine(q);
}
}
commas.Close();
}
在下面的文章中,您可以找到多種讀取和寫入大文件的方法。 在 C# 中使用流讀取大型文本文件
基本上,您只需要讀取將被重用的緩沖區中的字節。 這樣您就可以將非常少量的文件加載到內存中。
不要讀取整個文件,而是嘗試逐行讀取和處理。 這樣您就不會冒遇到內存不足異常的風險。 因為即使您成功地為程序組織了更多內存,總有一天文件會再次變得太大。
但是如果您使用較少的內存,程序可能會降低速度,因此基本上您必須平衡內存使用和執行時間。 一種解決方法是使用緩沖輸出,一次讀取多於一行或在多個線程中轉換字符串。
逐行閱讀文件,它將幫助您避免OutOfMemoryException
。 我個人更喜歡使用using
來處理流。 它確保在出現異常時關閉文件。
public static void ToCSV(string fileWRITE, string fileREAD)
{
using(var commas = new StreamWriter(fileWRITE))
using(var file = new StreamReader("yourFile.txt"))
{
var line = file.ReadLine();
while( line != null )
{
string q = (y.Substring(0,15)+","+y.Substring(15,1)+","+y.Substring(16,6)+","+y.Substring(22,6)+ ",NULL,NULL,NULL,NULL");
commas.WriteLine(q);
line = file.ReadLine();
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.