找回密码
 加入
搜索
查看: 3574|回复: 4

[效率算法] 【已解决】请问如何提升/优化文本读取的效率

[复制链接]
发表于 2014-1-21 09:59:19 | 显示全部楼层 |阅读模式
本帖最后由 setion 于 2014-1-21 10:36 编辑

我现在有一个几万行的文本,数据格式大概如下
2013-01-02 01:02:03:    -9
2013-01-02 01:02:04:    -11
2013-01-02 01:02:05:    -10
2013-01-02 01:02:06:    -13
2013-01-02 01:02:07:    -14
2013-01-02 01:02:08:    -13
2013-01-02 01:02:09:    -12

我需要取最后面的那个负数,我现在用的方法是通过 FileReadLine()读取每行的数据,然后在用StringRegExp()通过正则表达式来取最后那个数字,数据少的时候,大概1ms能处理一行数据,但是数据量大的时候就很慢了。3W行数据花了至少十多分钟,分析了一下,应该是文件太大,FileReadLine花费的时间太久,我想把文本预读到内存里然后再操作,或者使用其它方法,求高手指点,不胜感激,谢谢
发表于 2014-1-21 10:21:49 | 显示全部楼层
对于较大的文件用FileOpen先获取句柄。我在公司的老电脑上测试5w行的文件,用以下代码0.3s左右能获取完数字,用_ArrayDisplay显示花费时间多一些,不过7s左右也能显示出来了。
#include <array.au3>
$hTimer = TimerInit()
$hFile = FileOpen("test.txt")
$sText = FileRead($hFile)
FileClose($hFile)
$aNum = StringRegExp($sText, "(?m)\:\s+(-\d+)", 3)
$iDiff = TimerDiff($hTimer)
ConsoleWrite("Time: " & $iDiff / 1000 & "s")
If IsArray($aNum) Then _ArrayDisplay($aNum)
 楼主| 发表于 2014-1-21 10:30:44 | 显示全部楼层
回复 2# haijie1223


    谢谢你,我已经自己优化了。
昨天是这样写的
$File = fileopen($Path)
$Content = FileRead($File)
for $line = 1 to xxx Step 1
$LineContent = FileReadLine($Content,$line)
$RSSI = StringRegExp($LineContent , 'regExp' , 3)
next
这样写有问题,修改成如下就OK了
$File = fileopen($Path)
$Content = FileRead($File)
;for $line = 1 to xxx Step 1
;$LineContent = FileReadLine($Content,$line)
$RSSI = StringRegExp($Content , 'regExp' , 3)
;next
发表于 2014-1-21 10:38:21 | 显示全部楼层
回复 3# setion


    能用正则的就不要用循环读取之类的命令~
发表于 2014-1-29 22:12:58 | 显示全部楼层
我就有此问题,之前用的方法与LZ一样
看来我需要改代码了
谢谢2楼
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-5-10 13:47 , Processed in 0.092804 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表