Zapis pliku wymaga zoptymalizowania pod kątem ciężkiego ruchu 3
to pytanie jest kontynuacją pierwszej części, każdy, kto jest zainteresowany, skąd pochodzę, może odwołać się do części 1 i części 2, ale nie jest to konieczne.
zapis pliku należy zoptymalizować pod kątem dużego ruchu
Zapis pliku wymaga zoptymalizowania pod kątem ciężkiego ruchu części 2
teraz mam fragment roboczy, odpowiednia część znajduje się poniżej:
public static class memoryStreamClass
{
static MemoryStream ms1 = new MemoryStream();
public static void fillBuffer(string outputString)
{
byte[] outputByte = Encoding.ASCII.GetBytes(outputString);
ms1.Write(outputByte, 0, outputByte.Length);
if (ms1.Length > 8100)
{
emptyBuffer(ms1);
ms1.SetLength(0);
ms1.Position = 0;
}
}
static void emptyBuffer(MemoryStream ms)
{
FileStream outStream = new FileStream("c:\\output.txt", FileMode.Append);
ms.WriteTo(outStream);
outStream.Flush();
outStream.Close();
}
powyższy fragment działa dobrze, a błąd jest wolny. generuje około 8 KB danych przy każdym zapisie.
Teraz staram się wielowątkować powyższy kod, aby zwiększyć wydajność wąskiego gardła zapisu IO i pojawiły się problemy. Poniższy fragment jest tym, co próbowałem spróbować.
Zasadniczo mam 2 identyczne MemoryStream, jeśli powiedzmy, że ms1 jest pełny, zapisuje ms1 do pliku i przełącza na ms2, podczas gdy ms1 pisze, i odwrotnie.
public static class memoryStreamClass
{
static MemoryStream ms1 = new MemoryStream();
static MemoryStream ms2 = new MemoryStream();
static int c = 1;
public static void fillBuffer(string outputString)
{
byte[] outputByte = Encoding.ASCII.GetBytes(outputString);
if (c == 1)
{
ms1.Write(outputByte, 0, outputByte.Length);
if (ms1.Length > 8100)
{
c = 2;
Thread thread1 = new Thread( () => emptyBuffer(ms1));
thread1.Start();
ms1.SetLength(0);
ms1.Position = 0;
}
}
else
{
ms2.Write(outputByte, 0, outputByte.Length);
if (ms2.Length > 8100)
{
c = 1;
Thread thread2 = new Thread(() => emptyBuffer(ms2));
thread2.Start();
ms2.SetLength(0);
ms2.Position = 0;
}
}
}
powyższy kod może się kompilować i uruchamiać, jednak zapis wyjściowy nie zawsze wynosi 8 KB i zapisuje się zbyt często (niż mój program z pojedynczym wątkiem). czy ktoś może mi oświecić i wskazać, co jest nie tak z moim programem? Dziękuję Ci bardzo