• 4918阅读
  • 5回复

[提问]问个文件操作的奇怪问题 [复制链接]

上一主题 下一主题
离线sloadstar
 

只看楼主 倒序阅读 楼主  发表于: 2013-08-31
无聊,用qt写了个股票数据提取软件,数据来源大智慧分笔数据,每日单个市场的数据文件大概100MB左右(暂时只针对深圳市场分析,所以100M只是深圳的数据文件大小),程序本身是多线程读取不涉及写操作(由于出问题,所以把多线程写入的部分给暂时屏蔽了),因为有问题,所以测试的时候都是只开了单线程读取,OK,基本应用环境就是这样。
软件的循环流程如下:
foreach (code ,stocklist)
{
foreach(singleDayData, alldayData)
{
读取操作
}
}
所以假设一共M个股票,需要提取N天的数据,则最外层的循环是M,内存循环是N。所以正常情况下,需要qfile open,close不同的数据文件  M*N次 。
问题来了,我现在提取一年的数据信息,大概也就提取几百个股票个数据信息以后,程序运行速度就会一下子变的很慢(cpu占用也变的很低,否则是基本占满),而且每次都并不是在循环到同一个股票位置开始变慢,具有很大的随机性。经过我定位是在读文件的时候速度变慢了,我用了下面这样一种语句来读取数据信息:
file.read((char*)&singleDay, 52);
奇怪的是,如果我让程序M*N次都从同一个文件读数据,就不会变慢;或者每次都是seek到各个文件的同一个位置以后再读,速度也不会变慢。
不知道有没有人遇到过类似的情况,指导解决思路的冒个泡吧
离线bingyifeng

只看该作者 1楼 发表于: 2013-08-31
>>file.read((char*)&singleDay, 52)
52 是笔误?
这个值太小了吧
<span style="color:blue ">淘宝,绿石斋</span> <a href="http://shop33295817.taobao.com“> <span style="color:blue ">各种水晶饰品,手链,项链 </span></a>
离线sloadstar

只看该作者 2楼 发表于: 2013-08-31
一天的数据文件中一个股票就有几千条这样的52~
离线bingyifeng

只看该作者 3楼 发表于: 2013-08-31
修改为 512 或 1024 试下?

操作系统的文件cache 一般都是512倍数。
按这个数字读的话,效率是最高的。

先按512的倍数读到singleDay中,再在singleDay把她按照 52,52这样的块进行处理。

<span style="color:blue ">淘宝,绿石斋</span> <a href="http://shop33295817.taobao.com“> <span style="color:blue ">各种水晶饰品,手链,项链 </span></a>
离线jdwx

只看该作者 4楼 发表于: 2013-08-31
关于速度,我做了一个大智慧F10提取器,第一次运行很慢,立即再运行一次飞快。
因为硬盘的速度和windows的磁盘缓存,导致的这个结果,第二次是从缓存里读出来的,所以飞快。
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线sloadstar

只看该作者 5楼 发表于: 2013-09-01
回 4楼(jdwx) 的帖子
看来像我这么做的人真不少啊,呵呵,F10相关资料 提取我也做过,速度问题没有太明显的感觉,昨天改把数据源放到ssd上了,速度果然是普通硬盘不能比的,特别是开多线程后,看来这个问题的瓶颈还是在硬盘速度啊。
快速回复
限100 字节
 
上一个 下一个