Как уменьшить использование памяти в этой передаче файлов C #? - PullRequest
0 голосов
/ 18 апреля 2011

У меня есть простое приложение для передачи файлов, написанное на c # с использованием TCP для отправки данных.

Вот как я отправляю файлы:

Socket clientSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);


        byte[] fileName = Encoding.UTF8.GetBytes(fName); //file name
        byte[] fileData =  new byte[1000*1024];
        byte[] fileNameLen = BitConverter.GetBytes(fileName.Length); //length of file name
        FileStream fs = new FileStream(textBox1.Text, FileMode.Open);            
        try
        {
            clientData = new byte[4 + fileName.Length];
        }
        catch (OutOfMemoryException exc)
        {
            MessageBox.Show("Out of memory");
            return;
        }

        fileNameLen.CopyTo(clientData, 0);
        fileName.CopyTo(clientData, 4);
        clientSock.Connect("172.16.12.91", 9050);
        clientSock.Send(clientData, 0, clientData.Length, SocketFlags.None);                       
        progressBar1.Maximum = (int)fs.Length;
        while (true)
        {
            int index = 0;
            while (index < fs.Length)
            {
                int bytesRead = fs.Read(fileData, index, fileData.Length - index);
                if (bytesRead == 0)
                {
                    break;
                }

                index += bytesRead;
            }
            if (index != 0)
            {
                clientSock.Send(fileData, index, SocketFlags.None);
                if ((progressBar1.Value + (1024 * 1000)) > fs.Length)
                {
                    progressBar1.Value += ((int)fs.Length - progressBar1.Value);
                }
                else
                    progressBar1.Value += (1024 * 1000);
            }

            if (index != fileData.Length)
            {
                progressBar1.Value = 0;
                clientSock.Close();
                fs.Close();

                break;

            } 
        }            

    }

В TaskManager версия Release использования этого приложения занимает 13 МБ, когда я использую OpenFileDialog, затем до 16 МБ, когда он отправляет данные и остается там. Что я могу сделать, чтобы уменьшить использование памяти? Или есть хороший инструмент, который я могу использовать для контроля общего объема памяти в приложении?

И пока мы там, действительно ли 16 МБ так высоко?

Ответы [ 2 ]

3 голосов
/ 18 апреля 2011

16 МБ не слишком много памяти.Вы можете использовать встроенный визуальный студийный профилировщик, чтобы увидеть, что стоит больше всего производительности.См. Ссылку ниже для получения дополнительной информации о профилировщике: http://blogs.msdn.com/b/profiler/archive/2009/06/10/write-faster-code-with-vs-2010-profiler.aspx

0 голосов
/ 27 апреля 2011

Я заметил, что, когда я минимизирую любое приложение, использование памяти довольно значительно снижается. В конце концов я искал способ воспроизвести этот эффект программно, и вот что я нашел:

[DllImport("kernel32.dll")]
        public static extern bool SetProcessWorkingSetSize(IntPtr proc, int min, int max);
        public void ReleaseMemory()
        {
            GC.Collect();
            GC.WaitForPendingFinalizers();
            if (Environment.OSVersion.Platform == PlatformID.Win32NT)
            {
                SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1);
            }
        }

Я не знаю минусов в использовании этого, но пока ему удалось сэкономить как минимум 13 МБ памяти.

...