当前位置:编程学习 > VB >>

vb中如何用api快速读取大于1G的txt数据啊

如题,小弟用input试了下,回回死机,显然不行,请教高手们指点api的方法啊
还有个问题就是我的这个数据组类似下面的数据
11 12 13
21 22 23 
31 32 33 34 35
41 42 43 44 45 
51 52 53
61 62 63 64 65
71 72 73
我只需要五列的数据,三列的不需要,怎么样把五列所有数据读到一个数组里啊
很急,拜托大家帮帮忙了!不胜感激! --------------------编程问答-------------------- 分页,跟什么API无关 --------------------编程问答-------------------- 具体说说啊,新手,不是很明白 --------------------编程问答-------------------- 加doevents
--------------------编程问答--------------------
引用 3 楼 chinaboyzyq 的回复:
加doevents

加了还是会读很长时间啊,能不能快一点的读出来啊
大家说的好含蓄啊,可以尽量具体点吗?小弟新手 --------------------编程问答--------------------
引用 1 楼 ybh37 的回复:
分页,跟什么API无关
我现在不显示,就是读进来,这跟分页有关系吗?现在问题是读的很慢 --------------------编程问答-------------------- http://topic.csdn.net/u/20080708/15/5C039D93-9EFE-490D-B1C2-7C0F3A508093.html
看看老马和xmxoxo的精彩代码,不过他们是针对50M以内的文件
至于你的上G的文件,不知道有没有用,实在不行你就私密他们两个人解决一下. --------------------编程问答--------------------
引用 6 楼 xiaolinyouni 的回复:
http://topic.csdn.net/u/20080708/15/5C039D93-9EFE-490D-B1C2-7C0F3A508093.html
看看老马和xmxoxo的精彩代码,不过他们是针对50M以内的文件
至于你的上G的文件,不知道有没有用,实在不行你就私密他们两个人解决一下.
确实很精彩,但是打开我的这个文件就显示数据溢出了。。。 --------------------编程问答--------------------
引用 7 楼 c532482705 的回复:
引用 6 楼 xiaolinyouni 的回复:
http://topic.csdn.net/u/20080708/15/5C039D93-9EFE-490D-B1C2-7C0F3A508093.html
看看老马和xmxoxo的精彩代码,不过他们是针对50M以内的文件
至于你的上G的文件,不知道有没有用,实在不行你就私密他们两个人解决一下.
确实很精彩,但是打开我的这个文件就显示数据溢……

你把1G多的文件一起装进内存一定很精彩。 --------------------编程问答--------------------
引用 8 楼 chinaboyzyq 的回复:
引用 7 楼 c532482705 的回复:

引用 6 楼 xiaolinyouni 的回复:
http://topic.csdn.net/u/20080708/15/5C039D93-9EFE-490D-B1C2-7C0F3A508093.html
看看老马和xmxoxo的精彩代码,不过他们是针对50M以内的文件
至于你的上G的文件,不知道有没有用,实在不行你就私密他们两个人解决一下……
大哥,别光看笑话啊,给小弟想个办法啊
--------------------编程问答-------------------- 你厉害,1G的txt --------------------编程问答-------------------- 是dat的,我刚写错了
--------------------编程问答-------------------- 谁敢教教我不-_-!!! --------------------编程问答-------------------- 1g的数据应该边处理边读取,设定一个合适大小的内存区块,然后用多线程,否则速度很难快起来。 --------------------编程问答-------------------- 多快才算快 --------------------编程问答-------------------- 所以嘛,使用数据库是多么的重要。。。。 --------------------编程问答--------------------
引用楼主 c532482705 的回复:
如题,小弟用input试了下,回回死机,显然不行,请教高手们指点api的方法啊
还有个问题就是我的这个数据组类似下面的数据
11 12 13
21 22 23 
31 32 33 34 35
41 42 43 44 45 
51 52 53
61 62 63 64 65
71 72 73
我只需要五列的数据,三列的不需要,怎么样把五列所有数据读到一个数组里啊
很急,拜托大家帮帮……


使用ReadFile按照需要读取吧 --------------------编程问答-------------------- 如果LZ要秒杀就没辙,总得要确定一个你能接受的时间范围,读文件的速度不是靠API,主要是取决于设备的IO速度,人能做的只是优化一下算法,提高处理数据的速度。 --------------------编程问答--------------------
引用 17 楼 c_cyd2008 的回复:
如果LZ要秒杀就没辙,总得要确定一个你能接受的时间范围,读文件的速度不是靠API,主要是取决于设备的IO速度,人能做的只是优化一下算法,提高处理数据的速度。
我有一个fortran编写的同样功能的程序,读取并计算只需要大概三分钟,我用vb实现是否能达到这个效果,还有就是我用二进制读取的时候为什么每次都死机啊? --------------------编程问答-------------------- 我记得陈辉的博客有这方面的文章,你去搜索下。 --------------------编程问答-------------------- Dim aa$, Trec&, S, S2, Ary$()
Private Sub Command1_Click()
   'On Error Resume Next
   Open "c:\test.txt" For Input As #1
   aa = StrConv(InputB(LOF(1), 1), vbUnicode)
   Close #1
   S = Split(aa, vbNewLine)
   List1.Clear: Trec = 0
   List1.Visible = False '批量数据先隐藏 读完后再显示 速度快N倍
   For i = 0 To UBound(S)
      aa = Trim(S(i))
      If aa <> "" Then
         S2 = Split(aa, " ")
         If UBound(S2) >= 3 Then
            ReDim Preserve Ary$(Trec)
            Ary(Trec) = aa
            List1.AddItem Ary(Trec)
            Trec = Trec + 1
         End If
      End If
   Next i
   List1.Visible = True
End Sub

--------------------编程问答--------------------
引用 18 楼 c532482705 的回复:
引用 17 楼 c_cyd2008 的回复:
如果LZ要秒杀就没辙,总得要确定一个你能接受的时间范围,读文件的速度不是靠API,主要是取决于设备的IO速度,人能做的只是优化一下算法,提高处理数据的速度。
我有一个fortran编写的同样功能的程序,读取并计算只需要大概三分钟,我用vb实现是否能达到这个效果,还有就是我用二进制读取的时候为什么每次都死机啊?

呵呵,我只把你的Input换成Line Input,在我机器上读取1.2g类似于你的文件的文档,耗时50~60秒,读并写耗时130~180秒,你说这个效果行不? --------------------编程问答-------------------- 导入sql.再处理,行不??? --------------------编程问答--------------------
引用 21 楼 c_cyd2008 的回复:
引用 18 楼 c532482705 的回复:
引用 17 楼 c_cyd2008 的回复:
如果LZ要秒杀就没辙,总得要确定一个你能接受的时间范围,读文件的速度不是靠API,主要是取决于设备的IO速度,人能做的只是优化一下算法,提高处理数据的速度。
我有一个fortran编写的同样功能的程序,读取并计算只需要大概三分钟,我用vb实现是否能达到这个效果,还有就是我用二进制读取的时候为什么每次……
效果有这么好吗,我开始就用line input的啊,我怎么不行啊,能把详细代码分享下吗,不胜感激! --------------------编程问答-------------------- 以下代码实测耗时120~200s,文件大小1.2G,内容和你的差不多,为5列数字,CPU:E5300;RAM:2G;硬盘:西数WDC WD3200 剩余空间:50G

Dim f1 As String, f2 As String
Dim tmpStr As String
Dim t As Double

CDlg.ShowOpen
If CDlg.FileName = "" Then Exit Sub
f1 = CDlg.FileName
CDlg.ShowSave
If CDlg.FileName = "" Then Exit Sub
f2 = CDlg.FileName

t = Timer   '开始计时
Open f1 For Input As #1
Open f2 For Output As #2
PBar1.Max = LOF(1)
Label2.Caption = "文件大小:" & Round(PBar1.Max / 1024) & "M"
While Not EOF(1)
    Line Input #1, tmpStr
    'PBar1.Value = PBar1.Value + LenB(tmpStr)
    'Label1.Caption = "共耗时:" & Round(Timer - t, 1) & "秒"
    'DoEvents       '更新UI太耗时了,加上猛增3倍多
    If Len(tmpStr) > 10 Then   '等于没处理,加上看看对时间的影响
        Print #2, tmpStr
    End If
Wend
Close #2
Close #1
Label1.Caption = "共耗时:" & Round(Timer - t, 1) & "秒"

--------------------编程问答-------------------- 对于大文件,不要指望一次读完,一次写完。
要一块一块地读,一块一块地写!
推荐内存映射方式:
http://topic.csdn.net/u/20090731/08/63642fa7-d60d-4107-8e74-7cbe93e60f4f.html --------------------编程问答-------------------- 读入数组  翻页 --------------------编程问答-------------------- 对于大的txt文件,不论你怎么读取都不会快。建议换成数据来处理。 --------------------编程问答-------------------- 对于大量的数据灵活操作而言,不会是以单纯的数据内容来存储与处理的,这样肯定不会快。
通常的做法是有相关的文件头和数据索引等信息补助处理,否则怎么都快不起来。
打个比方,就硬盘数据来说吧:
如果打开我的电脑,系统就加载所有的数据到内存,1个不现实(因为内存肯定小过硬盘很多,
装也装不下),2个是没必要(因为你不会想一次看完所有硬盘上的数据重中挑选你的东西)
所以,Windows 文件系统在设计时就分了几个部分来解决这种不现实和没必要的情况。
如:软盘中的FAT12文件系统,开头有1个扇区装文件系统信息和引导程序,18个扇区装两份
FAT表,14个扇区FDT表,最后剩余的扇区装数据。当你访问软盘时,系统会根据FDT表查询出
文件名或目录名,然后用户打开指定文件时才会根据FAT表数据去读取指定扇区号的数据内容。
作为数据处理,可以考虑类似的方式对相关数据或数据段落进行索引,并编排写入表中,因为
索引表的内容肯定要比直接的数据量少许多,即使真的循环处理起来效率也会高很多。特别是
针对有特定条件的搜索,这种方式更有效。比如配合CRC码或异或校验码等方式索引某些内容,
效率会提高很多。
但如果是想实现那种编辑大文件的软件,数据内容不能改动,最简单的就是看到哪读到哪,
看不到的就不去读,这样效率就会高许多,即使读上10G的文件都不会慢,因为能看到的内容
并不多,只要计算好滚动条参数配合文件读写区域就可以了。
补充:VB ,  API
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,