Effizienter Weg, um große tab-getrennte txt-Datei?
Ich habe eine tab-getrennte txt-Datei mit 500K Datensätze. Ich bin mit dem code unten, um Daten zu Lesen auf dataset. Mit 50K es funktioniert gut, aber 500K, es gibt "Ausnahme vom Typ 'System.OutOfMemoryException " wurde ausgelöst."
Was ist die effizientere Art und Weise zu Lesen, große tab-getrennte Daten?
Oder wie dieses Problem zu beheben? Bitte geben Sie mir ein Beispiel
public DataSet DataToDataSet(string fullpath, string file)
{
string sql = "SELECT * FROM " + file; //Read all the data
OleDbConnection connection = new OleDbConnection //Connection
("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + fullpath + ";"
+ "Extended Properties=\"text;HDR=YES;FMT=Delimited\"");
OleDbDataAdapter ole = new OleDbDataAdapter(sql, connection); //Load the data into the adapter
DataSet dataset = new DataSet(); //To hold the data
ole.Fill(dataset); //Fill the dataset with the data from the adapter
connection.Close(); //Close the connection
connection.Dispose(); //Dispose of the connection
ole.Dispose(); //Get rid of the adapter
return dataset;
}
InformationsquelleAutor Michael Born | 2011-05-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden Sie ein stream-Ansatz mit
TextFieldParser
- auf diese Weise werden Sie nicht laden Sie die ganze Datei in den Speicher in einem Rutsch.href="http://www.dotnetperls.com/textfieldparser" >dotnetperls.com/textfieldparser
aus deinem link "TextFieldParser so gerendert wird eine umständliche und langsame Lösung, die am besten sein kann, allein gelassen in seiner hart-zu-finden-namespace."
Ich verlinkt, um zu zeigen, für die Nutzung in C#. Wenn im Vergleich zu
string.Split
es wird in der Tat", ein umständlich und langsam-Lösung". Aber das bedeutet nicht machen einen fairen Vergleich. Der Artikel bietet keine andere parser als Vergleich.und langsam" könnte es sein. Aber es funktioniert, und vermeidet viele der Probleme, die Sie laufen in mit der hand geschrieben-getrennte text-Datei-Parser. Ich nehme "umständlich und langsam, aber funktioniert" über "schnell und fehlerhaft" jeden Tag.
InformationsquelleAutor Oded
Sie wirklich wollen, zählen Sie die Quelldatei und die Verarbeitung der einzelnen Zeile zu einem Zeitpunkt. Ich verwende die folgenden
Dann für jede Zeile können Sie teilen Sie es mit tabs und die Verarbeitung der einzelnen Zeile zu einem Zeitpunkt. Dies hält die Erinnerung ganz tief runter für die Analyse verwenden Sie nur den Speicher, wenn die Anwendung Sie braucht.
foreach (var line in File.ReadLines("filename"))
. Das tut das gleiche wie IhreEnumerateLines
Methode.Aber-Datei.ReadLines-gibt ein string-array. Die version oben gibt eine Zeile zu einem Zeitpunkt, nicht die Pufferung der Datei im Arbeitsspeicher.
Nein,
File.ReadLines
gibt ein enumerator, der die Datei liest eine Zeile zu einem Zeitpunkt.File.ReadAllLines
gibt ein string-array.InformationsquelleAutor Nick Randell
Haben Sie versucht, die TextReader?
Auch diese Lösung sich nicht mit den angegebenen Werte zu ermöglichen tab-Zeichen angezeigt, die innerhalb dieser Werte.
InformationsquelleAutor Mr.
Fand ich FileHelpers
Vielleicht hilft es.
InformationsquelleAutor Phuc Thai