怎么同时读取多个大容量的文件

fishly_0 2008-03-29 08:13:15
rt,比如说在一些提供视频下载的网站,如果有100个用户同时下载,且下载的电影都不一样。那么服务端该用什么方法读取电影文件并发给客户端呢?用内存映射文件的方法吗? 因为肯定要将电影分为n个数据包发送给客户端,所以每次都要打开文件,然后读取相应位置的文件数据的话,我怕速度会慢。 高手指点下,这种情况怎么处理比较好:)
...全文
188 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
Supper_Jerry 2008-03-31
  • 打赏
  • 举报
回复
加大内存,内存映射
liuworld 2008-03-31
  • 打赏
  • 举报
回复
还有 向youku,土豆这样的视频网站要是把文件都在硬盘上 无异于找死
liuworld 2008-03-31
  • 打赏
  • 举报
回复
1、文件的自动分类 ,按访问的频繁程度,当然要有合理的算法评估
2、频繁访问的文件放在内存中,想facebook大概用了400台电脑的内存(现在的服务器支持32G内存)专门用来存文件,这就要求要有好的文件管理系统,一般都是mysql记录文件的存储位置
,当然大公司都有自己的文件管理系统,例如Google的数据中心。
fishly_0 2008-03-31
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 coding_hello 的回复:]
视频网站下载能提供多大的带宽?宽带一般也就是128-256KB吧,…
[/Quote]

呵呵,现在就是先考虑用单机的,集群的我们这没人接触过,都不知道怎么弄。 现在感觉要用单机做这也的服务器很难办啊,因为如果文件数量多,容量大,那用户下载时,硬盘的读写太频繁了,可能没用多长时间这硬盘就挂了。 如果全部缓冲的话,就跟barenx 说的一样,除非有海量的内存了。
问下高手,如果用集群的话,该如何下手呢?是否买相关的设备,厂家就会提供相关的技术支持呢?
yichuankun 2008-03-31
  • 打赏
  • 举报
回复
mark
Skt32 2008-03-31
  • 打赏
  • 举报
回复
两级:内存缓冲+文件预读。各用一个线程
fishly_0 2008-03-31
  • 打赏
  • 举报
回复
多谢大家的回复了。主要是怕这种情形:服务器有100个大文件提供下载, 当有100+的客户端连上来后,如果每个客户端每次下载的文件都不一样,那么读取硬盘的频率是非常频繁的,这也是我最担心的问题。 到底应该想方法缓冲文件数据呢还是应该看看在硬件上如何改进?
liveforme 2008-03-31
  • 打赏
  • 举报
回复
学习学习
supercow 2008-03-31
  • 打赏
  • 举报
回复
CreateFileMapping 是比较简单易行的了
jjfwenwenti 2008-03-31
  • 打赏
  • 举报
回复
mark,我也在找办法~
zdsdtc 2008-03-30
  • 打赏
  • 举报
回复
mark
ryfdizuo 2008-03-30
  • 打赏
  • 举报
回复
os一般是会优化的,
hityct1 2008-03-30
  • 打赏
  • 举报
回复
mark
WizardOz 2008-03-30
  • 打赏
  • 举报
回复
也许是我无知了,但是你读取大文件发送不代表就要把文件一起都读到内存中阿。
读一段到缓冲区,发送出去后再读一段不行吗?
chenyu2202863 2008-03-30
  • 打赏
  • 举报
回复
CreateFileMapping
IT_lau 2008-03-30
  • 打赏
  • 举报
回复
mark
cnzdgs 2008-03-30
  • 打赏
  • 举报
回复
楼主可以放心地按照正常方式读文件,完全不用考虑这个问题,这些是操作系统要考虑的,系统的磁盘缓冲会把事情处理好,如果你自己处理往往会适得其反。
野男孩 2008-03-29
  • 打赏
  • 举报
回复
[Quote=引用楼主 fishly_0 的帖子:]
rt,比如说在一些提供视频下载的网站,如果有100个用户同时下载,且下载的电影都不一样。那么服务端该用什么方法读取电影文件并发给客户端呢?用内存映射文件的方法吗? 因为肯定要将电影分为n个数据包发送给客户端,所以每次都要打开文件,然后读取相应位置的文件数据的话,我怕速度会慢。 高手指点下,这种情况怎么处理比较好:)
[/Quote]

视频网站下载能提供多大的带宽?宽带一般也就是128-256KB吧,就算1MByte/s,100个并发也就100MByte/s,服务器都是SCSI硬盘,那速度傻读也能满足这要求吧。内存就算2G,用内存映射,也够用了。

真正高并发的话,肯定是有集群的,不会是单机。
barenx 2008-03-29
  • 打赏
  • 举报
回复
disk bufffer ,利用磁盘缓冲技术,划分出一块内存作为数据缓冲,这个操作系统也会做的,你的程序可以实现的文件预读,就是当用户还没有请求相应的数据的时候,预测用户的行为,把数据事先载入内存

不要试图全内存缓冲,除非你的服务器用了1024TB的内存
oo 2008-03-29
  • 打赏
  • 举报
回复
磁盘访问速度慢是没办法的。
还是用磁盘阵列或分布式存储解决的彻底些。

64,649

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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