找回密码
 加入
搜索
查看: 4883|回复: 11

[效率算法] au3一次读取1000行数据的问题,能不能提升一下速度(已解决)

  [复制链接]
发表于 2010-9-19 13:49:44 | 显示全部楼层 |阅读模式
本帖最后由 qq123123 于 2010-10-14 12:25 编辑

au3一次读取记事本1000行数据的问题,能不能提升一下速度,
我有一个记事本,大概900M 左右,一次我要读取1000行的数据出来,
小弟不才,自己做了一个,但是运行速度太慢了,特别是读取到10多万行的时候,巨卡!
请求高手帮我改善一下!或者提示一下,我需要用什么方法能做得更好


        $time = @HOUR & @MIN& @SEC
        $sl = 1000        ;读取指定行的字符.
       
        $xie = FileOpen("读取到的号.ini", 2);把帐号组合在一起
        $i = 1
        While $i <= $sl
                  $yeshu = FileOpen("行号.ini", 0)
                  $xinghao2 = FileReadLine($yeshu,1);读出行号
                  FileClose($yeshu)
                  $ye = $xinghao2 + 1
                ;~ ==========
                  $bokebiaoti = FileOpen("原始文本.txt", 0)
                  $shuju = FileReadLine($bokebiaoti,$xinghao2)
                  FileClose($bokebiaoti)
                ;~ ===========
                  $yeshu = FileOpen("行号.ini", 2)
                  FileWriteLine($yeshu, $ye)
                  FileClose($yeshu)
                  ToolTip( $shuju,0,200 )
                ;~ ===========
                  If $shuju = "" Then
                   MsgBox(16,"提示错误","要查找的帐号不足"&$sl&"个!请更换",5)
                   Exit
                  EndIf
                  FileWrite($xie, $shuju&@CRLF)
                $i = $i + 1
        WEnd
        FileClose($xie)
        ;~ =============================================
        $xie = FileOpen("读取帐号/读取到的号.ini",0);把帐号组合在一起
        $hao = FileRead($xie,88800)
        FileClose($xie)
        ClipPut($hao);在剪切板中写入文本.

        $time_2 = @HOUR & @MIN & @SEC
$ok = $time_2 - $time
TrayTip ( "账号成功提取", "一共运行了"&$ok&"秒:",5,1 )
Sleep(1000)
发表于 2010-9-19 20:23:02 | 显示全部楼层
这个我知道有个udf,能一次读出来存成数组,每一行为一个数组元素
_FileReadToArray(
 楼主| 发表于 2010-9-19 20:54:39 | 显示全部楼层
#include <file.au3>
Dim $aRecords
If Not _FileReadToArray("数据.txt",$aRecords) Then
   MsgBox(4096,"Error", " Error reading log to Array     error:" & @error)
   Exit
EndIf
For $x = 1 to $aRecords[0]
        ToolTip( $x&"---"&$aRecords[$x],0,300 )
;~         Msgbox(0,'Record:' & $x, $aRecords[$x])
Next
发表于 2010-9-19 22:03:04 | 显示全部楼层
900M 的记事本文档… 那还不得搞死~ MS也不限制下…
发表于 2010-9-19 22:43:39 | 显示全部楼层
这么大的数据量应该用数据库来做,插入、更新、删除、导入导出快速方便。

评分

参与人数 1金钱 +15 收起 理由
afan + 15

查看全部评分

发表于 2010-9-21 18:25:26 | 显示全部楼层
使用StringSplit将文件拆分为N个字符串,然后再分别处理,我测试过从9万行的TXT文本中读取一些有用的数据仅2s-3s左右。此外,不建议实时写入,推荐将读取的数据写入一个变量中,使用“&=”,然后再一次写入一个文本。不过对于900M就不知道了呃!
发表于 2010-9-22 18:38:50 | 显示全部楼层
先获取文件的总行数,然后拆分成10个(或者更多)相等的段,将每个段的行号存入一个数组内,文件读取的时候从第 n 个行号开始,到n+1个行号结束。 用定时器API创建多个线程操作试试。 定时器内部操作的数据处理过程可以用一个子函数来完成,所有定时器都调用该子函数,不同的是,子函数中的参数决定了文件读取开始行和结束行。
最后,各个定时器处理完的结果分别存入各自的全局变量,所有定时器执行完毕后将结果再重组输出。
发表于 2010-9-22 21:06:01 | 显示全部楼层
这个也要用哦,我也要看看
发表于 2010-9-23 02:13:26 | 显示全部楼层
看看先。。。。
发表于 2010-9-23 19:28:22 | 显示全部楼层
900MB的txt文件太大了,程序要对txt文件进行操作,肯定要打开把数据全部读入内存,这样操作太慢,建议换其他的方式存放这900MB的数据
发表于 2010-9-23 19:32:50 | 显示全部楼层
你是根据账号来读取文件内容的,可以按账号建个ini文件,
格式:账号=ZZZ
文件名=xXXX
然后找到哪个账号再去读取那个文件,这样会快点,
我的意思是把900MB的文件分拆成一个个文件。不知道这样符合不符合你的要求。还有如果一个文件夹内文件多了读取也会慢的。
发表于 2010-9-24 02:35:37 | 显示全部楼层
内容太多,建议根据首字母或者其他特征来分开多个文本。。
即便是数据库,为了加快速度,也经常采取分表的方法。。
另外,尽量内存操作,不到万不得已,不写入硬盘。。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-5-17 12:08 , Processed in 0.085772 second(s), 28 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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