近日在想用Remoting传输文件,用户在400以上.以下是服务端读取文件的方法,发现占用CPU随用户的增多而增多,在公司内部测试6-7个人就占用70%左右,不知道有什么好的解决方案    /// <summary>
    ///    
    /// </summary>
    /// <param name="octet">客户端数组</param>
    /// <param name="offset">文件开始处</param>
    /// <param name="Count">数组大小</param>
    /// <returns></returns>
    public int GetByte(out byte[] octet, long offset)
    {
        int ReadByte = 0;
        using (FileStream fs = new FileStream(Route, FileMode.Open,FileAccess.Read))
        {
            octet = new byte[Speed];
            try
            {
                fs.Seek(offset, SeekOrigin.Current);
                BufferedStream inStream = new BufferedStream(fs);
                ReadByte = inStream.Read(octet, 0, Speed);
                inStream.Close();
            }
            catch (Exception)
            {
                return -1;
            }
        }
        return ReadByte;
    }
    #endregion

解决方案 »

  1.   

    解决方案就是不用Remoting,用Socket,Remoting本身效率就很低!原因就是它的序列化和反序列化大量的使用了反射技术。
      

  2.   

    Socket 也有考虑过 但是一直没有找到相关点对点的例子 无法实施 
      

  3.   

    开另外一个线程,这样可以有效降低CPU使用率
      

  4.   

    GetByte 明显的性能问题 ,比方文件有1M,我一次读1024字节,这样打开多少次文件,IO操作太频繁,且每次还要定位
      

  5.   

    using (FileStream fs = new FileStream(Route, FileMode.Open,FileAccess.Read))Route指向一个物理文件?
    可否直接读到内在,做为一个内存流来操作.可以不用每次都IO操作.
      

  6.   

    Route 是物理文件 做为一个内存流来操作.可以不用每次都IO操作 不明白
      

  7.   

    Remoting你优化的空间不大,只能在读取文件的时候做一些优化。其实Remoting也不是点对点的。它也可以说是一种C/S结构的东西!用Socket很容易实现的。
      

  8.   

    wzd24(牧野)(衣带渐宽终不悔,为伊消得人憔悴) 
    ==========================
    有没有Socket例子给我参考下
      

  9.   

    呵呵…………
    在MSDN上和我的博客里都有,但我博客里面的例子不是很完整的。你可以去看看!
      

  10.   

    Route 是物理文件 做为一个内存流来操作.可以不用每次都IO操作 不明白------------------------------------------------
    意思是说:
    把文件一次性读到内存里面.以后直接从内存里读取想相要的数据就可以了.
      

  11.   

    private byte[] poData;
            private void GetFileData(string asPath)
            {
                string sPath = asPath ;            StreamReader sr = new StreamReader(sPath);
                poData = Encoding.Default.GetBytes(sr.ReadToEnd());
                sr.Close();
            }
            public int GetByte(out byte[] octet, long offset)
            {
                int ReadByte = 0;
                using (MemoryStream fs = new MemoryStream(poData, 0, poData.Length, false, false))
                {
                    octet = new byte[Speed];
                    try
                    {
                        fs.Seek(offset, SeekOrigin.Current);
                        BufferedStream inStream = new BufferedStream(fs);
                        ReadByte = inStream.Read(octet, 0, Speed);
                        inStream.Close();
                    }
                    catch (Exception)
                    {
                        return -1;
                    }
                }
                return ReadByte;
            }
      

  12.   

    sckoo(挨踢工程师) ( ) 信誉:100    Blog   加为好友  2007-05-28 16:29:49  得分: 0  
     
     
       文件不止一个,1-2千G的文件 哪有那么大的内存啊
      
     
    -------------------------------------------------------------------------
    也难怪为这么占CPU啊.
    fs.Seek(offset, SeekOrigin.Current);
    这一句就要CPU找半年.
    晕....
      

  13.   

    汗!~~~~fs.Seek(offset, SeekOrigin.Current);
    这个占用很多CPU吗? 我认为占用CPU的在读文件那块
      

  14.   

    和Remoting的性能有很大关系,我以前项目中也用过Remoting,也是占CPU非常高,占100%,换成Windows消息通讯后CPU一下子就降下来了!只占1%。想想差别吧!
      

  15.   

    ...区别太大了 好 从今个起学习socket 结贴
      

  16.   

    文件不止一个,1-2千G的文件 哪有那么大的内存啊想想,cpu 按3.0GHz的主频算.搜一遍多长时间?呵呵 .太夸张了吧.