关于多线程文件传输那种方案较好

hutuyang 发布于 2013/08/17 21:26
阅读 1K+
收藏 2
今天有人问我关于多线程的问题,大概是这样的,现在需要从目录下将文件读取,然后发送出去。同事问我是先将文件都读出来然后安排线程一次性发送,还是一边读取一边发送,两个那个比较好。这里的文件,一个大小差不多20M左右。目录下的文件很多,这里可以设为至少用百做单位。当然也不是真的将文件都去完,同事实现的时候只是将文件名读到一个队列中,这个也是用多线程实现的。这两种那种较快呢??
加载中
0
中山野鬼
中山野鬼
一个文件操作一个进程。慢慢发。哈。
0
铂金小虫
铂金小虫
先不说多线程,读取方式上一次读取后发送和边读边发没什么区别。你20m的文件不可能放在一个tcp包内发送的吧,关键还是如何提高读取磁盘的速率。这就可以通过通道(FilleChannel)按块读取。
0
厦门王五
厦门王五

看这个问题,应该涉及两个方面的多线程,一是多文件传输分多线程,二是大文件传输分多线程。综合起来还会有内存大小要求跟磁盘IO的速率问题。如果多线程读文件理论上IO会被充分利用的,不过同时都先把文件都读到内存里面再发送,数据总量大的话,应该很吃内存的。如果有磁盘分区分块等信息,可以分析出磁盘io的瓶颈,可以考虑分线程按块读取发送,每个文件单独一个线程,线程内每次读取分块大小*N的数据发送。如果有超大文件,可以再分线程,按照文件大小分隔成几个传输,每个传输的数据量差不多就可以省下一些传输的时间了,前提是服务端支持多线程传一个文件、网络速度足够。

个人意见,欢迎指正

厦门王五
厦门王五
线程的数量跟系统资源有关系,cpu线程总数 磁盘io 网络带宽 资源阻塞等都有关系。多线程不意味些效率一定高,主要还是看硬件系统,根据实际的硬件系统规划软件方案才是合适的。ramdisk可以解决从机械磁盘读取速度不够快的问题,不过它的大小毕竟也是有限的,如果像你说的有上百G 20M左右的文件,那估计可以考虑使用磁盘阵列RAID0了。
hutuyang
hutuyang
那么可以在存储文件时对存储进行一定的控制,使其尽量顺序读取。考虑的环境主要是在服务器上,用的是redhat。 在者,如果有上百G的数据,每个文件都20M左右,那么通过多线程读取文件不知道是否会提升性能,安排多少线程最适合呢?并且linux下有ramdisk,是否可以通过这种手段来提高访问效率呢??
厦门王五
厦门王五
回复 @hutuyang : 使用多线程也要考虑一下文件在磁盘的位置,因为机械磁盘读取文件涉及磁盘寻道时间,虽然这个不好估计。一般来说,磁盘读取一个空间上连续的大文件的速度比读取多个不连续的小文件要快(假设总的大小一致)。如果能够实现顺序读取文件的话,性能应该也能有所提升。因此可能就会有大的文件分块发送的需要,小的文件也可能会有打包读取到内存再发送的需要。
厦门王五
厦门王五
回复 @hutuyang : 一个是磁盘IO,一个是网络IO,理论上会有影响,因为数据在计算机内部需要通过总线传输,但是对于现代计算机系统来说,影响不会很大,一则CPU及总线的速度已经很大了,二则磁盘IO一般有独立的处理机制。
hutuyang
hutuyang
意思就是如果一次性先将文件读取到内存中,内存首先会被这些文件耗掉不少。有个困惑的地方,如果一边读,一遍发送,读的化造成的是Io的占用,但是发送这些文件并不影响到这些io吧??
返回顶部
顶部