qq123123 发表于 2010-9-19 13:49:44

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

本帖最后由 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)

manlty 发表于 2010-9-19 20:23:02

这个我知道有个udf,能一次读出来存成数组,每一行为一个数组元素
_FileReadToArray(

qq123123 发表于 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
        ToolTip( $x&"---"&$aRecords[$x],0,300 )
;~         Msgbox(0,'Record:' & $x, $aRecords[$x])
Next

afan 发表于 2010-9-19 22:03:04

900M 的记事本文档… 那还不得搞死~ MS也不限制下…

zps26 发表于 2010-9-19 22:43:39

这么大的数据量应该用数据库来做,插入、更新、删除、导入导出快速方便。

xkowen 发表于 2010-9-21 18:25:26

使用StringSplit将文件拆分为N个字符串,然后再分别处理,我测试过从9万行的TXT文本中读取一些有用的数据仅2s-3s左右。此外,不建议实时写入,推荐将读取的数据写入一个变量中,使用“&=”,然后再一次写入一个文本。不过对于900M就不知道了呃!

lanfengc 发表于 2010-9-22 18:38:50

先获取文件的总行数,然后拆分成10个(或者更多)相等的段,将每个段的行号存入一个数组内,文件读取的时候从第 n 个行号开始,到n+1个行号结束。 用定时器API创建多个线程操作试试。 定时器内部操作的数据处理过程可以用一个子函数来完成,所有定时器都调用该子函数,不同的是,子函数中的参数决定了文件读取开始行和结束行。
最后,各个定时器处理完的结果分别存入各自的全局变量,所有定时器执行完毕后将结果再重组输出。

zzz867 发表于 2010-9-22 21:06:01

这个也要用哦,我也要看看

newstar20088 发表于 2010-9-23 02:13:26

看看先。。。。

jiangllllp 发表于 2010-9-23 19:28:22

900MB的txt文件太大了,程序要对txt文件进行操作,肯定要打开把数据全部读入内存,这样操作太慢,建议换其他的方式存放这900MB的数据

jiangllllp 发表于 2010-9-23 19:32:50

你是根据账号来读取文件内容的,可以按账号建个ini文件,
格式:账号=ZZZ
文件名=xXXX
然后找到哪个账号再去读取那个文件,这样会快点,
我的意思是把900MB的文件分拆成一个个文件。不知道这样符合不符合你的要求。还有如果一个文件夹内文件多了读取也会慢的。

minterz 发表于 2010-9-24 02:35:37

内容太多,建议根据首字母或者其他特征来分开多个文本。。
即便是数据库,为了加快速度,也经常采取分表的方法。。
另外,尽量内存操作,不到万不得已,不写入硬盘。。
页: [1]
查看完整版本: au3一次读取1000行数据的问题,能不能提升一下速度(已解决)