setion 发表于 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花费的时间太久,我想把文本预读到内存里然后再操作,或者使用其它方法,求高手指点,不胜感激,谢谢{:face (239):}

haijie1223 发表于 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)

setion 发表于 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

haijie1223 发表于 2014-1-21 10:38:21

回复 3# setion


    能用正则的就不要用循环读取之类的命令~

hnfeng 发表于 2014-1-29 22:12:58

我就有此问题,之前用的方法与LZ一样
看来我需要改代码了
谢谢2楼
页: [1]
查看完整版本: 【已解决】请问如何提升/优化文本读取的效率