[请教] c# 读大文件时候什么方式效率最高

crowsboy 2004-08-13 11:34:08
例如(每个线程中的发送代码):
---------------------
maxChunkLength=1*1024
FileStream fs = new FileStream(@"d:\1.zip", FileMode.Open,FileAccess.Read,FileShare.Read);
int bytesRemaining=fs.Length;
BinaryReader reader = new BinaryReader(fs);

while (bytesRemaining>0)
{
int bytesToRead = (bytesRemaining < maxChunkLength) ? bytesRemaining : maxChunkLength;
byte[] bytes = new byte[bytesToRead];
int bytesRead = reader.Read(bytes, 0, bytesToRead);
... ...
//发送数据 或者写入文件
bytesRemaining -= bytesToRead;
}
... ...
-------------------

d:\1.zip文件假设为500M,500人同时读该文件,并用socket发送出去。(多线程形式)
在这种情况下,CPU占用为50%,内存占用为60MB,但是硬盘已经高速运转达到极限了。
不知道有什么好的方法提供效率。

不知道扩大maxChunkLength=1*1024 这个读取文件的数组的大小是否能改善状况。
(我想增加数组大小的话,就会减少读取文件所需要的次数,同时增加SOCKET的发送时间,就增加了每次读取之间的间隔时间)*^_^* 不知道这样想对不对

或者有其它方式可以更好的实现,请高手提些建议。

机器配置:P4 2.6X2/2G DDR/1G网卡/SCSI RAID0磁盘阵列(500GB)
...全文
903 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
crowsboy 2004-08-15
  • 打赏
  • 举报
回复
感谢大家的意见,根据大家的意见我会进一步做修改的,谢谢!
qqchen79 2004-08-14
  • 打赏
  • 举报
回复
Use Asynchronous Network I/O (I/O completion port) may boost the CPU usage. Check out http://msdn.microsoft.com/library/en-us/cpguide/html/cpconusingnon-blockingserversocket.asp.

As test7979(test7979) said, I also suspect that the network I/O is the bottle neck, not disk access.
allen1981813 2004-08-14
  • 打赏
  • 举报
回复
楼主,我学习中
siugwan 2004-08-14
  • 打赏
  • 举报
回复
mark
xdzxplina 2004-08-14
  • 打赏
  • 举报
回复
学习中
test7979 2004-08-13
  • 打赏
  • 举报
回复
如果要达到个人速率在200Kb/s就可以满足的话

那么还是有改进的方法的

1.改直接从文件获取数据成先做一个文件数据的缓冲

所有的Socket要发送数据时都从那个缓冲取,这样如果那个

缓冲Cache的算法好的话,最多从硬盘重复读3-5次就够了

2.使用异步的Socket(不知道你有没有使用)

和异步的FileStream(.Net2.0 支持)

3.最好的方法当然是向BT学习啦 :)
guohong1219 2004-08-13
  • 打赏
  • 举报
回复
现在HP都在提起网络的适应性边缘架构,你哪儿再快别人哪儿的网络不行或者交换机的交换容量和背板带宽太小也是会大大影响你传输的速度的。要提高网络传输的效率光靠这点还是不行的软硬件都要提高才行。
elite2018 2004-08-13
  • 打赏
  • 举报
回复
use stream buffer , or ftp directly
Jasonchen82 2004-08-13
  • 打赏
  • 举报
回复
需要高速网络支持。
test7979 2004-08-13
  • 打赏
  • 举报
回复
1G的网卡是说 1G bits 吧?如果我没弄错的话,如果在考虑30%的效率
那么也就 50M/s 不到哦
test7979 2004-08-13
  • 打赏
  • 举报
回复
想想看吧,1G的网卡,也就是说128M/s,你现在要传 500M * 500人的数据

至少需要 500 * 500 / 128 / 60 = 32分钟的时间

而从硬盘中读取数据,哪怕是一个烂盘,我一秒读个10M肯定没问题的

读取 500M 也就 1分钟不到
crowsboy 2004-08-13
  • 打赏
  • 举报
回复
发送的代码很简单了

 //mySocket是客户端的连接
 if (mySocket.Connected)
 {
   mySocket.Send(bSendData, bSendData.Length,0);
 }
crowsboy 2004-08-13
  • 打赏
  • 举报
回复
原来用IIS支撑做下载的时候,可以承受1000个人用HTTP来下这种文件,(每个人速率在200Kb/s左右)。

我想上面的情况瓶颈不应该在网络上(因为用的是1G的网卡直连本地5G的中国电信骨干)

1G网卡的效率应该能有30%左右,就是300M/s左右。
qq7good 2004-08-13
  • 打赏
  • 举报
回复
能把你的发送文件的代码给我看看吗
我发送文件总是受缓冲区的限制
能把代码给我看看吗?
wukun52@163.com
谢谢
test7979 2004-08-13
  • 打赏
  • 举报
回复
磁盘效率再高也没有用,网络才是瓶颈

哪怕你RAID100,每秒100万转都没用哦

BT的作者才是真正的高啊
hertcloud 2004-08-13
  • 打赏
  • 举报
回复
关注!~
crowsboy 2004-08-13
  • 打赏
  • 举报
回复
但是这样500M大小的文件有很多哦(几百G)!这样恐怕要很大的内存。
wnlovezxm 2004-08-13
  • 打赏
  • 举报
回复
把流做成静态的,所有线程都从该流里读取,而不是从硬盘!
songxuehui 2004-08-13
  • 打赏
  • 举报
回复
学习
crowsboy 2004-08-13
  • 打赏
  • 举报
回复
Up!
加载更多回复(9)

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧