Zacząłem robić coś w następujący sposób:Skuteczny sposób pisać wiele linii w pliku tekstowym
using (TextWriter textWriter = new StreamWriter(filePath, append))
{
foreach (MyClassA myClassA in myClassAs)
{
textWriter.WriteLine(myIO.GetCharArray(myClassA));
if (myClassA.MyClassBs != null)
myClassA.MyClassBs.ToList()
.ForEach(myClassB =>
textWriter.WriteLine(myIO.GetCharArray((myClassB)));
if (myClassA.MyClassCs != null)
myClassA.MyClassCs.ToList()
.ForEach(myClassC =>
textWriter.WriteLine(myIO.GetCharArray(myClassC)));
}
}
ten wydawał się dość wolno (~ 35 sekund do 35000 wierszy).
Potem próbowałem wykonać przykład here, aby utworzyć bufor z następującym kodem, ale nic mnie to nie zyskało. Wciąż widziałem czasy około 35 sekund. Czy wystąpił błąd w sposobie zaimplementowania bufora?
using (TextWriter textWriter = new StreamWriter(filePath, append))
{
char[] newLineChars = Environment.NewLine.ToCharArray();
//Chunk through 10 lines at a time.
int bufferSize = 500 * (RECORD_SIZE + newLineChars.Count());
char[] buffer = new char[bufferSize];
int recordLineSize = RECORD_SIZE + newLineChars.Count();
int bufferIndex = 0;
foreach (MyClassA myClassA in myClassAs)
{
IEnumerable<IMyClass> myClasses =
new List<IMyClass> { myClassA }
.Union(myClassA.MyClassBs)
.Union(myClassA.MyClassCs);
foreach (IMyClass myClass in myClasses)
{
Array.Copy(myIO.GetCharArray(myClass).Concat(newLineChars).ToArray(),
0, buffer, bufferIndex, recordLineSize);
bufferIndex += recordLineSize;
if (bufferIndex >= bufferSize)
{
textWriter.Write(buffer);
bufferIndex = 0;
}
}
}
if (bufferIndex > 0)
textWriter.Write(buffer);
}
Czy jest lepszy sposób na osiągnięcie tego?
Czy próbowałeś użyć StringBuilder i zbudować ciąg, a następnie po prostu napisz raz do pliku. – Sorceri
jakikolwiek szczególny powód użycia buforów? – JustCode
Czy jesteś pewien, że to naprawdę jest to problem? Co się stanie, jeśli po prostu napiszesz do 'StreamWriter' owiniętego na przykład' MemoryStream'? –