多线程读写文件的问题(100分)

  • 主题发起人 主题发起人 ranking
  • 开始时间 开始时间
R

ranking

Unregistered / Unconfirmed
GUEST, unregistred user!
 小弟在写一个proxy计费程序,需要对服务器的日志进行解析,每个日志文件的大小都在200
 M左右,一行是一条记录。因为解析速度太慢,大概一个文件要3个小时。所以要用到多线程。
 这里有三个问题:
 1。几个线程怎样读同一个文件,要以行为单位。
 2。几个线程怎样写同一个文件。
 3。是不是同一个线程既要实现读也要实现写。
 急。请各位大侠快快帮忙。谢谢。分数不够我可以再加的。
 
有没有懂的呀!!!
 
除非你有多路 Xeon 或者 Raid,否则速度不但不会加快反而会减慢。
我没敢试过多线程同时读取文件,在进行读取操作的时候,线程应当互斥。
 
其实想用多线程来读,是因为在读日志的文件的
时候,有一部分是在读到一个网址的时候,解析
它的ip,这一部分是最浪费时间的。所以我想这样来做。另外,假如不用线程来做,程序对资源的占用率极低。所以我想就像把一个文件分割成几块来做不是会快一些吗?
 
如果你实在要多线程,应当首先创建一个行级索引文件。文件中记录每一行的开始位置。
然后,分配每一个线程的读取范围。文件的读取操作应当使用互斥量或者临界区。
另外,我认为比较好的方案是主线程读取文件,创建线程查询 ip。然后子线程处理
查询后的所有操作(当然对于有些情况这是做不到的,具体问题具体分析)。
 
为什么不导入到数据库中呢,这样处理起来很方便。
 
我对此感兴趣,有情况也让我收到一封Email。
 
你用多线程不会提高速度的,只是可以随时操作界面。
 
只需讓主線程讀寫文件即可,省了不少麻煩~
在主線程讀進文件後,
分配十個線程來分析(可增可減),
等分析完全部後,再由主線程寫入文件。
這樣應該比較恰當!
 
依我看,这个程序的瓶颈不在文件的读写,而是在IP的解析上。
解决办法如下:
在读到IP地址的时候不要立即对它进行解析,而是将其放到一个内存对照表中去,同时将网址
用对应的Hash值代替。
表中元素的大致结构如下:
Addr:String;
//网址
HashValue:Int64;
//为了尽可能的避免重叠,用64位比较好——10^9个不同的网址发生重叠
//的概率不到 1/10^9,绝对安全
IP:Integer;
在第一遍扫描完成以后(耗时应该在分钟级吧),使用多个(30 or more)线程解析内存对照表
中的网址。然后再将解析后的IP写到最终结果中去。
另外,为了提高最后写IP的过程的速度,可以在第一遍扫描的时候生成一个易于处理(定位)
的中间文件(如果觉得麻烦干脆放到数据库里去)。
经过这样处理之后,耗时有望下降到半个小时左右。
如果采用我的方案,在第一遍扫描和最后写结果的时候没有必要使用多线程——此时CPU的
占用率已经接近100%,多线程读写文件只会增加磁头调度的时间。
 
谢谢大家。我为什么不能给creation_zy兄分呀。
 
用多线程只有比以前更慢
 
奇怪了
但还是请结束问题吧
 
只需讓主線程讀寫文件即可,省了不少麻煩~
在主線程讀進文件後,
分配十個線程來分析(可增可減),
等分析完全部後,再由主線程寫入文件。
這樣應該比較恰當!
 
多人接受答案了。
 
后退
顶部