Я получаю данные от клиента и сохраняю его на локальном диске на локальном хосте. Я проверил его на файл с 221 МБ, но тест для файла 1Gb дает следующее исключение:System.OutOfMemoryException на стороне сервера для файлов-клиентов
необработанное исключение типа «System.OutOfMemoryException» произошло в mscorlib.dll
Ниже приводится код на стороне сервера, где исключение из стеблей.
ОБНОВЛЕНО
Сервер:
public void Thread()
{
TcpListener tcpListener = new TcpListener(ipaddr, port);
tcpListener.Start();
MessageBox.Show("Listening on port" + port);
TcpClient client=new TcpClient();
int bufferSize = 1024;
NetworkStream netStream;
int bytesRead = 0;
int allBytesRead = 0;
// Start listening
tcpListener.Start();
// Accept client
client = tcpListener.AcceptTcpClient();
netStream = client.GetStream();
// Read length of incoming data to reserver buffer for it
byte[] length = new byte[4];
bytesRead = netStream.Read(length, 0, 4);
int dataLength = BitConverter.ToInt32(length,0);
// Read the data
int bytesLeft = dataLength;
byte[] data = new byte[dataLength];
while (bytesLeft > 0)
{
int nextPacketSize = (bytesLeft > bufferSize) ? bufferSize : bytesLeft;
bytesRead = netStream.Read(data, allBytesRead, nextPacketSize);
allBytesRead += bytesRead;
bytesLeft -= bytesRead;
}
// Save to desktop
File.WriteAllBytes(@"D:\LALA\Miscellaneous\" + shortFileName, data);
// Clean up
netStream.Close();
client.Close();
}
Я получаю размер файла первой со стороны клиента за которым следуют данные.
1). Должен ли я увеличить размер буфера или любую другую технику?
2). File.WriteAllBytes()
и File.ReadAllBytes()
кажется блокирующим и зависающим на ПК. Там есть какой-либо метод асинхронизации, чтобы помочь обеспечить прогресс файла, полученного на стороне сервера.
Вы назначаете массив байтов емкостью 1 ГБ.Неудивительно, что у вас заканчивается память на посредственной машине. Запишите данные в файл chunk-by-chunk, используя поток. –
Не храните весь файл в памяти, просто напишите байты на диск (используя поток filestream), как только вы их получите. Вы также можете рассчитать прогресс в этой точке. –
как я могу рассчитать прогресс в этот раз? @DavidLibido – Khan