请教高效的文件并发写入 本帖最后由 xipiyou 于 2010-01-15 14:02:38 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 大侠们,快来想想办法.因为web中写文件一般是用于log的时候,所以自己想了个办法,希望各位大侠指点下:首先把所有写文件请求全不写到内存中,因为内存比IO速度快很多。然后后台运行一程序,定期把内存中保存的数据一次性写入log文件,并清除内存中已经log下来的部分。 没看明白楼主的意思并发读文件,肯定不会有什么冲突,但是并发写文件,系统就会异常,通常解决并发写的问题,就是文件写时加锁,当然单纯的lock并非就不异常了,并发写入量再大点,比如几万人在线时候,还是会引发异常,所以比较稳妥的办法,就是不出错的办法,就是写入时开辟多线程进行写入,并且写入时候,先尝试写打开,没人独占时候再写入,这种方法肯定不会有异常,但是可能会有延迟另一种办法就是放消息队列里,这种办法也是不错的选择还有一种办法就是放缓存中,当然.NET缓存是不靠谱的,可以放在memcached中,然后更新都放入内存中,读取更新也都暂时在内存中进行,最后等服务器空闲的时候,比如晚上得时候,统一的查找更新的缓存键,更新到数据库中 简单说,你把写文件的动作放到 System.Threading.ThreadPool.QueueUserWorkItem 的回调方法里就可以了,你不需要设计什么“定期”操作。 这个问题,解决方法有很直接的方法。篇幅太多了。 你搜搜,.net 2.0 面向对象编程解密13章和14章 异步调用 进程和线程,对你 的问题很有帮助。 lock(fs){....}这样不知道成不,以前没搞过 其实意思很简单,就是想要个高效、不会出错、不会漏记log的方法。当多线程写入的时候,加入一个进程等待的时间太久了,还是会有异常的,会报:另一个进程已打开文件。类似这样的异常,这样的话,等待超时的那个线程就没有记录到LOG了。 在.NET 里面好像是可以的。貌似SQL里面的 表级锁,行级锁吧 求解 大师们,小弟有问题求救啊 怎么使用javascript 获取AutoCompleteExtender1 对象 判断页面是否有值传入 求助:怎么创建一个新的浏览器窗口,并把参数传递过去 取得cpu和硬盘的信息生成序列号,怎么才能根据序列号写自己的注册码 截取字符串片段是出错! 用什么样的代码既可以显示jpg有可以显示swf文件的? .NET中怎么实现这个功能?? 要让服务器支持ASP.NET,要装什么? RadUpload 多文件上传问题 vs2005第一次打开网页问题
首先把所有写文件请求全不写到内存中,因为内存比IO速度快很多。然后后台运行一程序,定期把内存中保存的数据一次性写入log文件,并清除内存中已经log下来的部分。
并发读文件,肯定不会有什么冲突,但是并发写文件,系统就会异常,通常解决并发写的问题,就是文件写时加锁,当然单纯的lock并非就不异常了,并发写入量再大点,比如几万人在线时候,还是会引发异常,所以比较稳妥的办法,就是不出错的办法,就是写入时开辟多线程进行写入,并且写入时候,先尝试写打开,没人独占时候再写入,这种方法肯定不会有异常,但是可能会有延迟
另一种办法就是放消息队列里,这种办法也是不错的选择
还有一种办法就是放缓存中,当然.NET缓存是不靠谱的,可以放在memcached中,然后更新都放入内存中,读取更新也都暂时在内存中进行,最后等服务器空闲的时候,比如晚上得时候,统一的查找更新的缓存键,更新到数据库中
简单说,你把写文件的动作放到 System.Threading.ThreadPool.QueueUserWorkItem 的回调方法里就可以了,你不需要设计什么“定期”操作。
篇幅太多了。 你搜搜,.net 2.0 面向对象编程解密
13章和14章 异步调用 进程和线程,对你 的问题很有帮助。
{
....
}
这样不知道成不,以前没搞过