एक स्ट्रिंग चर में पाठ फ़ाइल को पढ़ने का सबसे तेज़ तरीका क्या है?
मैं समझता हूं कि इसे कई तरीकों से किया जा सकता है, जैसे व्यक्तिगत बाइट्स को पढ़ना और फिर उन लोगों को स्ट्रिंग में बदलना। मैं कम से कम कोडिंग वाली एक विधि की तलाश में था।
एक स्ट्रिंग चर में पाठ फ़ाइल को पढ़ने का सबसे तेज़ तरीका क्या है?
मैं समझता हूं कि इसे कई तरीकों से किया जा सकता है, जैसे व्यक्तिगत बाइट्स को पढ़ना और फिर उन लोगों को स्ट्रिंग में बदलना। मैं कम से कम कोडिंग वाली एक विधि की तलाश में था।
जवाबों:
कैसे के बारे में File.ReadAllText
:
string contents = File.ReadAllText(@"C:\temp\test.txt");
StreamReader.ReadToEnd
अधिक कुशल है।
StreamReader.ReadToEnd
की तुलना में अधिक कुशल है ReadAllLines
। जिसकी उम्मीद की जानी चाहिए, क्योंकि उत्तर भी पाठ को लाइनों में विभाजित करता है। लेकिन हम एक अलग तरीके के बारे में बात कर रहे हैं ReadAllText
। वास्तव में आपके द्वारा दिए गए उत्तर से पता चलता है कि ReadAllText
बस StreamReader.ReadToEnd
आंतरिक रूप से कॉल करता है।
File.ReadAllLines
बनाम सी # फ़ाइल हैंडलिंगStreamReader ReadLine
से एक बेंचमार्क तुलना
परिणाम। 10,000+ लाइनों वाली बड़ी फ़ाइलों के लिए स्ट्रीमराइज़र बहुत तेज़ है, लेकिन छोटी फ़ाइलों के लिए अंतर नगण्य है। हमेशा की तरह, फ़ाइलों के अलग-अलग आकार की योजना बनाएं, और File.ReadAllLines का उपयोग केवल तब करें जब प्रदर्शन महत्वपूर्ण न हो।
जैसा कि File.ReadAllText
दृष्टिकोण दूसरों द्वारा सुझाया गया है, आप तेज भी आज़मा सकते हैं (मैंने मात्रात्मक रूप से प्रदर्शन प्रभाव का परीक्षण नहीं किया है, लेकिन यह तुलना में तेज है File.ReadAllText
( नीचे तुलना देखें)। अंतर प्रदर्शन में हालांकि केवल बड़ी फ़ाइलों के मामले में दिखाई जाएगी।
string readContents;
using (StreamReader streamReader = new StreamReader(path, Encoding.UTF8))
{
readContents = streamReader.ReadToEnd();
}
सांकेतिक कोड के माध्यम से देखने ILSpy मैं के बारे में निम्नलिखित पाया है File.ReadAllLines
, File.ReadAllText
।
File.ReadAllText
- StreamReader.ReadToEnd
आंतरिक रूप से उपयोग करता हैFile.ReadAllLines
- इसके अलावा StreamReader.ReadLine
आंतरिक रूप से इसके अतिरिक्त ओवरहेड के साथ List<string>
रीड लाइन बनाने और फाइल के अंत तक लूपिंग करने के लिए उपयोग करता है।
तो दोनों विधियाँ सुविधा के ऊपर निर्मित एक अतिरिक्त परत हैं StreamReader
। यह विधि के सांकेतिक शरीर द्वारा स्पष्ट है।
File.ReadAllText()
ILSpy द्वारा अपघटित के रूप में कार्यान्वयन
public static string ReadAllText(string path)
{
if (path == null)
{
throw new ArgumentNullException("path");
}
if (path.Length == 0)
{
throw new ArgumentException(Environment.GetResourceString("Argument_EmptyPath"));
}
return File.InternalReadAllText(path, Encoding.UTF8);
}
private static string InternalReadAllText(string path, Encoding encoding)
{
string result;
using (StreamReader streamReader = new StreamReader(path, encoding))
{
result = streamReader.ReadToEnd();
}
return result;
}
File.ReadAllText
, भी ??
File.ReadAllText()
बस एक आवरण पर है StreamReader.ReadToEnd()
। मैं अनुमान लगा रहा हूं कि अतिरिक्त परत की तुलना में थोड़ा धीमा प्रदर्शन करना चाहिए StreamReader.ReadToEnd()
।
ReadAllText
सिर्फ एक आवरण है streamReader.ReadToEnd();
?
string contents = System.IO.File.ReadAllText(path)
यहाँ MSDN प्रलेखन है
File.ReadAllText () विधि पर एक नज़र डालें
कुछ महत्वपूर्ण टिप्पणियां:
यह विधि एक फ़ाइल खोलता है, फ़ाइल की प्रत्येक पंक्ति को पढ़ता है, और फिर एक स्ट्रिंग के तत्व के रूप में प्रत्येक पंक्ति को जोड़ता है। यह तब फ़ाइल को बंद कर देता है। एक पंक्ति को वर्ण वापसी ('\ r'), एक पंक्ति फ़ीड ('\ n'), या एक गाड़ी वापसी के बाद वर्ण रेखा के रूप में परिभाषित किया जाता है। परिणामस्वरूप स्ट्रिंग में समाप्ति कैरिज रिटर्न और / या लाइन फीड शामिल नहीं है।
यह विधि बाइट ऑर्डर के निशान की उपस्थिति के आधार पर किसी फ़ाइल की एन्कोडिंग का स्वचालित रूप से पता लगाने का प्रयास करती है। एन्कोडिंग प्रारूप UTF-8 और UTF-32 (दोनों बड़े-एंडियन और छोटे-एंडियन) का पता लगाया जा सकता है।
ReadAllText (String, Encoding) मेथड ओवरलोड का उपयोग तब करें जब आयात की जा सकने वाली पाठ फ़ाइलों को पढ़ सकें, क्योंकि अपरिचित वर्णों को सही ढंग से पढ़ा नहीं जा सकता है।
फ़ाइल हैंडल को इस विधि द्वारा बंद करने की गारंटी है, भले ही अपवाद उठाए गए हों
System.IO.StreamReader myFile =
new System.IO.StreamReader("c:\\test.txt");
string myString = myFile.ReadToEnd();
@ क्रिस क्षमा करें। यह उद्धरण है MSDN Microsoft
क्रियाविधि
इस प्रयोग में, दो वर्गों की तुलना की जाएगी। StreamReader
और FileStream
वर्ग अनुप्रयोग निर्देशिका से उनकी सम्पूर्णता में 10K और 200K के दो फ़ाइलों को पढ़ने के लिए निर्देशित किया जाएगा।
StreamReader (VB.NET)
sr = New StreamReader(strFileName)
Do
line = sr.ReadLine()
Loop Until line Is Nothing
sr.Close()
FileStream (VB.NET)
Dim fs As FileStream
Dim temp As UTF8Encoding = New UTF8Encoding(True)
Dim b(1024) As Byte
fs = File.OpenRead(strFileName)
Do While fs.Read(b, 0, b.Length) > 0
temp.GetString(b, 0, b.Length)
Loop
fs.Close()
परिणाम
FileStream
जाहिर है कि इस परीक्षण में तेजी है। StreamReader
छोटी फ़ाइल को पढ़ने के लिए अतिरिक्त 50% अधिक समय लगता है । बड़ी फ़ाइल के लिए, इसने 27% समय लिया।
StreamReader
विशेष रूप से लाइन ब्रेक की तलाश में है जबकि FileStream
ऐसा नहीं है। यह कुछ अतिरिक्त समय के लिए जिम्मेदार होगा।
अनुशंसाएँ
डेटा के एक खंड के साथ एप्लिकेशन को क्या करना है, इसके आधार पर, अतिरिक्त पार्सिंग हो सकती है जिसके लिए अतिरिक्त प्रसंस्करण समय की आवश्यकता होगी। एक परिदृश्य पर विचार करें जहां एक फ़ाइल में डेटा के कॉलम हैं और पंक्तियों को CR/LF
सीमांकित किया गया है। StreamReader
नीचे की तलाश में पाठ की पंक्ति काम करेगा CR/LF
, और फिर आवेदन अतिरिक्त पार्स डेटा की एक विशिष्ट स्थान देख करना होगा। (क्या आपने सोचा था कि स्ट्रिंग। सबस्ट्रिंग एक मूल्य के बिना आता है?)
दूसरी ओर, FileStream
विखंडू में डेटा पढ़ता है और एक प्रोएक्टिव डेवलपर अपने लाभ के लिए स्ट्रीम का उपयोग करने के लिए थोड़ा और तर्क लिख सकता है। यदि आवश्यक डेटा फ़ाइल में विशिष्ट स्थिति में है, तो यह निश्चित रूप से जाने का तरीका है क्योंकि यह मेमोरी के उपयोग को कम रखता है।
FileStream
गति के लिए बेहतर तंत्र है, लेकिन अधिक तर्क लेगा।
StreamReader.ReadToEnd
?
कम से कम संभव सी # कोड के साथ सबसे तेज़ तरीका अर्थ शायद यह एक है:
string readText = System.IO.File.ReadAllText(path);
आप उपयोग कर सकते हैं :
public static void ReadFileToEnd()
{
try
{
//provide to reader your complete text file
using (StreamReader sr = new StreamReader("TestFile.txt"))
{
String line = sr.ReadToEnd();
Console.WriteLine(line);
}
}
catch (Exception e)
{
Console.WriteLine("The file could not be read:");
Console.WriteLine(e.Message);
}
}
इस सामग्री को मज़ेदार और रोचक बताने वाले नोब्स के लिए, ज्यादातर मामलों में एक स्ट्रिंग में एक पूरी फ़ाइल पढ़ने का सबसे तेज़ तरीका ( इन बेंचमार्क के अनुसार ) निम्नलिखित है:
using (StreamReader sr = File.OpenText(fileName))
{
string s = sr.ReadToEnd();
}
//you then have to process the string
हालाँकि, किसी पाठ फ़ाइल को पढ़ने के लिए सबसे तेज़ सबसे तेज़ निम्नलिखित प्रतीत होता है:
using (StreamReader sr = File.OpenText(fileName))
{
string s = String.Empty;
while ((s = sr.ReadLine()) != null)
{
//do what you have to here
}
}
कई अन्य तकनीकों के खिलाफ रखो , इसने अधिकांश समय जीत लिया, जिसमें बफ़रड्रेडर के खिलाफ भी शामिल था।
आप इस तरह का उपयोग कर सकते हैं
public static string ReadFileAndFetchStringInSingleLine(string file)
{
StringBuilder sb;
try
{
sb = new StringBuilder();
using (FileStream fs = File.Open(file, FileMode.Open))
{
using (BufferedStream bs = new BufferedStream(fs))
{
using (StreamReader sr = new StreamReader(bs))
{
string str;
while ((str = sr.ReadLine()) != null)
{
sb.Append(str);
}
}
}
}
return sb.ToString();
}
catch (Exception ex)
{
return "";
}
}
आशा है कि यह आपकी मदद करेगा।
आप एक पाठ फ़ाइल से एक स्ट्रिंग में निम्नानुसार भी पाठ पढ़ सकते हैं
string str = "";
StreamReader sr = new StreamReader(Application.StartupPath + "\\Sample.txt");
while(sr.Peek() != -1)
{
str = str + sr.ReadLine();
}
public partial class Testfile : System.Web.UI.Page
{
public delegate void DelegateWriteToDB(string Inputstring);
protected void Page_Load(object sender, EventArgs e)
{
getcontent(@"C:\Working\Teradata\New folder");
}
private void SendDataToDB(string data)
{
//InsertIntoData
//Provider=SQLNCLI10.1;Integrated Security=SSPI;Persist Security Info=False;User ID="";Initial Catalog=kannan;Data Source=jaya;
SqlConnection Conn = new SqlConnection("Data Source=aras;Initial Catalog=kannan;Integrated Security=true;");
SqlCommand cmd = new SqlCommand();
cmd.Connection = Conn;
cmd.CommandType = CommandType.Text;
cmd.CommandText = "insert into test_file values('"+data+"')";
cmd.Connection.Open();
cmd.ExecuteNonQuery();
cmd.Connection.Close();
}
private void getcontent(string path)
{
string[] files;
files = Directory.GetFiles(path, "*.txt");
StringBuilder sbData = new StringBuilder();
StringBuilder sbErrorData = new StringBuilder();
Testfile df = new Testfile();
DelegateWriteToDB objDelegate = new DelegateWriteToDB(df.SendDataToDB);
//dt.Columns.Add("Data",Type.GetType("System.String"));
foreach (string file in files)
{
using (StreamReader sr = new StreamReader(file))
{
String line;
int linelength;
string space = string.Empty;
// Read and display lines from the file until the end of
// the file is reached.
while ((line = sr.ReadLine()) != null)
{
linelength = line.Length;
switch (linelength)
{
case 5:
space = " ";
break;
}
if (linelength == 5)
{
IAsyncResult ObjAsynch = objDelegate.BeginInvoke(line + space, null, null);
}
else if (linelength == 10)
{
IAsyncResult ObjAsynch = objDelegate.BeginInvoke(line , null, null);
}
}
}
}
}
}
मैंने एक ReadAllText और StreamBuffer के बीच 2Mb सीएसवी के लिए तुलना की और ऐसा लगा कि यह अंतर काफी छोटा है लेकिन रीडअलैक्ट को लगता है कि ऊपरी कार्यों को पूरा करने में लगने वाले समय से ऊपरी हाथ लगेगा।