Tom.Cat
禁止发言
禁止发言
  • 注册日期2001-10-10
  • 最后登录2019-07-29
  • 粉丝1
  • 关注0
  • 积分-53792分
  • 威望197411点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
  • 社区居民
阅读:2143回复:23

把实时的数据存储到硬盘上,怎么操作比较好?熟悉文件系统的水友提提意见

楼主#
更多 发布于:2004-08-05 10:50
用户被禁言,该主题自动屏蔽!

最新喜欢:

cyliucyliu
hzhq1
驱动老牛
驱动老牛
  • 注册日期2002-12-13
  • 最后登录2012-03-29
  • 粉丝0
  • 关注0
  • 积分32分
  • 威望1054点
  • 贡献值0点
  • 好评度606点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-08-11 12:50
看了大家的帖,觉得想得太深了。做法太麻烦。
既然是WINDOWS系统,就不要想得太复杂了。
有一个方法是:
1、把硬盘做成NTFS分区。
2、先建立足够大的内存映射文件(一个文件几百GB)
3、每次收到数据后往内存映射文件写。

在长时间工作、大数据量时会工作得比较好,开发难度降低了。

 

恩,
抄下来先。
这是一个,一个风雨交加的,漆黑的夜晚......恩,情节越来越复杂了。
Sunbeam
驱动小牛
驱动小牛
  • 注册日期2001-10-29
  • 最后登录2010-01-29
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望12点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-08-11 12:29
看了大家的帖,觉得想得太深了。做法太麻烦。
既然是WINDOWS系统,就不要想得太复杂了。
有一个方法是:
1、把硬盘做成NTFS分区。
2、先建立足够大的内存映射文件(一个文件几百GB)
3、每次收到数据后往内存映射文件写。

在长时间工作、大数据量时会工作得比较好,开发难度降低了。

堂堂正正做人,明明白白做事
grant
驱动老牛
驱动老牛
  • 注册日期2001-05-14
  • 最后登录2007-04-13
  • 粉丝0
  • 关注0
  • 积分350分
  • 威望35点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-08-10 14:39
要保证不丢失数据。
只看一段时间内的平均速度是不行的。
比如有一个采集系统,连续把数据传到内存,再从内存到硬盘。

我的作法是,直接用SCSI磁盘,通过ASPI函数按扇区写硬盘。
可以做到40MB/s采样直接存盘。

验证方法:
用20MHz采样频率采一扫频信号,存盘后做时间――频率图,看频率是不是连续。
助人乃快乐之本 有人给分就更快乐了 :-)
wisywyx
驱动牛犊
驱动牛犊
  • 注册日期2004-06-14
  • 最后登录2009-07-17
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-08-10 10:19
我用fwrite写文件
硬盘是Maxtor 80GB 7500rpm ATA的
可以达到35M的写速率
当然如果要稳定不丢数据,20~25M应该没问题
hzhq1
驱动老牛
驱动老牛
  • 注册日期2002-12-13
  • 最后登录2012-03-29
  • 粉丝0
  • 关注0
  • 积分32分
  • 威望1054点
  • 贡献值0点
  • 好评度606点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-08-06 10:55
继续关注中
这是一个,一个风雨交加的,漆黑的夜晚......恩,情节越来越复杂了。
Tom.Cat
禁止发言
禁止发言
  • 注册日期2001-10-10
  • 最后登录2019-07-29
  • 粉丝1
  • 关注0
  • 积分-53792分
  • 威望197411点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
  • 社区居民
6楼#
发布于:2004-08-05 16:44
用户被禁言,该主题自动屏蔽!
hzhq1
驱动老牛
驱动老牛
  • 注册日期2002-12-13
  • 最后登录2012-03-29
  • 粉丝0
  • 关注0
  • 积分32分
  • 威望1054点
  • 贡献值0点
  • 好评度606点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-08-05 16:29
我已经实现了不丢数据了。
但是想问问大家有没有更好的操作方法。谢谢。

 


众多水鬼们强烈要求资源共享
 :P
这是一个,一个风雨交加的,漆黑的夜晚......恩,情节越来越复杂了。
hzhq1
驱动老牛
驱动老牛
  • 注册日期2002-12-13
  • 最后登录2012-03-29
  • 粉丝0
  • 关注0
  • 积分32分
  • 威望1054点
  • 贡献值0点
  • 好评度606点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-08-05 16:28
IDE标称传输速度、硬盘缓冲大小、PCI-IDE接口速度等等因素,
对传输速率有什么影响啊?


恩,反正偶没做过,
乱问一通再说
 :D
这是一个,一个风雨交加的,漆黑的夜晚......恩,情节越来越复杂了。
hzhq1
驱动老牛
驱动老牛
  • 注册日期2002-12-13
  • 最后登录2012-03-29
  • 粉丝0
  • 关注0
  • 积分32分
  • 威望1054点
  • 贡献值0点
  • 好评度606点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-08-05 16:25
用API的WriteFile写普通的IDE硬盘,
速度大约能到多少啊?

这是一个,一个风雨交加的,漆黑的夜晚......恩,情节越来越复杂了。
Tom.Cat
禁止发言
禁止发言
  • 注册日期2001-10-10
  • 最后登录2019-07-29
  • 粉丝1
  • 关注0
  • 积分-53792分
  • 威望197411点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
  • 社区居民
10楼#
发布于:2004-08-05 16:24
用户被禁言,该主题自动屏蔽!
hzhq1
驱动老牛
驱动老牛
  • 注册日期2002-12-13
  • 最后登录2012-03-29
  • 粉丝0
  • 关注0
  • 积分32分
  • 威望1054点
  • 贡献值0点
  • 好评度606点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2004-08-05 16:23
直接通过IO写硬盘扇区速度很慢,还是通过文件系统的好,我曾经尝试写一个类似CIH的2K/XP下RING0病毒,直接写硬盘扇区,发现速度很慢就放弃了,郁闷。。。。。。


是数据直接写入物理扇区?
还是写到硬盘的缓冲区后,待空闲或缓冲满,硬盘控制器再将缓冲内容写入物理扇区?


这是一个,一个风雨交加的,漆黑的夜晚......恩,情节越来越复杂了。
RED_spring
驱动中牛
驱动中牛
  • 注册日期2002-07-28
  • 最后登录2016-11-06
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望19点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
  • 社区居民
12楼#
发布于:2004-08-05 16:10
如果持续15MByte/s的速度的话对系统性能会有点影响哦。 用ZwWriteFile 基本上就凑合了。我试过1G的数据大概就是1分钟多一些。
AthlonxpX86
驱动小牛
驱动小牛
  • 注册日期2002-11-10
  • 最后登录2013-07-17
  • 粉丝0
  • 关注0
  • 积分29分
  • 威望43点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2004-08-05 15:31
我现在的做法是在运行一个系统线程,将实时的数据用ZwWriteFile向文件里写。大家提提建议,可能请不了大家吃饭,但是分数相送没问题。
这个数据量比较大,每秒15MByte/s。

首先绝对不可能实时的,这违背多任务操作系统的基本思想,NTZwWriteFile引起I/O管理器工作,一般情况这将调用文件系统驱动的快速I/O.快速I/O与Cache管理器一起工作,将数据cache.(因此不会实时写硬盘,不过将加快数据传输速率)如果没有快速I/O,I/O管理器发送IRP_MJ_WRITE给文件系统驱动程序,驱动程序处理解析产生IRP,然后将IRP传递给位于I/O堆栈的下一个驱动程序处理.....以此类推,最后将写入硬盘。


一般情况下中不过要达到15MByte/s是绝对可以的,现在的硬盘一般都能达到25MByte/s。
在NT系统中如果是大数据量的文件传输操作,应该使用异步I/O用信号量来通知APP读写操作的完成情况,

给分吧,我最需要分,DDK2003正愁没分下载!!!
AthlonxpX86(桃源村)
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
14楼#
发布于:2004-08-05 14:38
直接通过IO写硬盘扇区速度很慢,还是通过文件系统的好,我曾经尝试写一个类似CIH的2K/XP下RING0病毒,直接写硬盘扇区,发现速度很慢就放弃了,郁闷。。。。。。
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
Tom.Cat
禁止发言
禁止发言
  • 注册日期2001-10-10
  • 最后登录2019-07-29
  • 粉丝1
  • 关注0
  • 积分-53792分
  • 威望197411点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
  • 社区居民
15楼#
发布于:2004-08-05 13:46
用户被禁言,该主题自动屏蔽!
RED_spring
驱动中牛
驱动中牛
  • 注册日期2002-07-28
  • 最后登录2016-11-06
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望19点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
  • 社区居民
16楼#
发布于:2004-08-05 12:56
常用的是做一个队列,每次的写请求都入队列,并触发一个Event。

系统线程里等待这个Event,每次触发就把队列里的写请求清空。(当然,数据也要写上去 :D :D)
Gong_XG
驱动太牛
驱动太牛
  • 注册日期2002-10-01
  • 最后登录2010-11-25
  • 粉丝0
  • 关注0
  • 积分313分
  • 威望46点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2004-08-05 12:30
我曾做过一个存储实时数据的,好像一次存9999个没问题,再多了就出错!只好多次存储!
当时也没查处问题原因!
Tom.Cat
禁止发言
禁止发言
  • 注册日期2001-10-10
  • 最后登录2019-07-29
  • 粉丝1
  • 关注0
  • 积分-53792分
  • 威望197411点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
  • 社区居民
18楼#
发布于:2004-08-05 12:19
用户被禁言,该主题自动屏蔽!
asmsys
驱动老牛
驱动老牛
  • 注册日期2002-03-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望17点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2004-08-05 11:51
唯一能做的就是,保证扇区连续,另外一次写的数据不要超过一个磁道的容量,一般是63*512。
另:上面说的并不是没有意义,无非是你自己写个专用的读写函数,函数中用OFFSET参数就行了。关键是考虑极限速度能不能达到你的要求。
上一页
游客

返回顶部