如何提高处理数据量很大文件的效率??

yhww 2005-10-10 12:27:27
最近遇到一个头痛的事情:有一个文本文件有大约200M,一共有1千多万条数据。数据结构比较简单,一共就是三列,id、name、value。想点击某个按钮将这些数据load到内存中。现在的实现是使用Open App.Path + "\resource\level1007.dat" For Input As #1的方式,每读取一行,进行split,然后存到一个自定义的type中,最后形成一个type的数组。

测试了一把,这种读取文件的方法非常慢,也许是我的机器不好,将这些数据全部load到内存中花了5个多小时!!请各位大侠拉兄弟一把。
...全文
252 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
yhww 2005-10-11
  • 打赏
  • 举报
回复
viena(维也纳nn-实心木头人) 兄提到的方法报错了。
Dim str1 As Variant
On Error GoTo ErrorHandler
Open App.Path + "\resource\level1007.dat" For Input As #1
str1 = StrConv(InputB$(LOF(1), #1), vbUnicode)
Close #1

Exit Sub
ErrorHandler:
showMessage "error=" + Str(Err.Number)
Close #1

Err.Number=7
是不是内存不够啊?
Summer006 2005-10-11
  • 打赏
  • 举报
回复
1,分批次处理;
2,转换成数据库;
3,其他高深技术。。汗

其实还不知道你的目的是什么?
如果只是显示,那显示到哪就读哪。
northwolves 2005-10-11
  • 打赏
  • 举报
回复
建议选择二进制方式打开,分段读取处理。
fxy_2002 2005-10-11
  • 打赏
  • 举报
回复
主要看后期准备如何处理。

如果是准备显示在窗体上,完全可以先少量加载一些行,然后根据需要再选择性加载。
如果是做统计,转换到 sql server 再处理会快很多。

一次性在内存中处理1000多万行不现实,完全可以用根据需要以技巧来避开。
viena 2005-10-11
  • 打赏
  • 举报
回复
内存不够
vansoft 2005-10-10
  • 打赏
  • 举报
回复
of123() 的意見不錯,建議換成數據庫。
viena 2005-10-10
  • 打赏
  • 举报
回复
用二进制方式打开,每次读到Byte数组缓冲区,是最快的,就是比较麻烦
viena 2005-10-10
  • 打赏
  • 举报
回复
只要你的内存够大,当然可以一次读取了

//每读取一行,进行split
一行一行读,当然慢

要充分利用磁盘与内存的直接交换
Open App.Path + "\resource\level1007.dat" For Input As 1
str1 = Strconv(InputB$(LOF(1), 1), vbUnicode)
close 1
先用vbCrLf分割得到每一行
of123 2005-10-10
  • 打赏
  • 举报
回复

1 不要试图一次读取所有数据。实际上,这样庞大的数组,也会引起虚拟内存的磁盘交换。

2 可以将文本文件直接作为数据库来处理,可以用 DAO 或 ADO。Jet 引擎所支持的外部数据库格式包括文本格式。

在数据文件同一路径下,创建一个 Schema.ini 文件(内容根据你实际情况调整):

[level1007.dat]

ColNameHeader=True

Format=TabDelimited

MaxScanRows=0

CharacterSet=ANSI

Col1=KEY Char Width 6

Col2=Char Width 50

Col3=HIGH Float Width 6

------------------------------

Dim db As DAO.Database, rs As DAO.Recordset

Set db = OpenDatabase(Name:=App.Path + "\resource\level1007.dat", _
Exclusive:=True, _
ReadOnly:=True, _
Connect:="TEXT")

Set rs = db.OpenRecordset("SELECT * FROM level1007")

Gutta 2005-10-10
  • 打赏
  • 举报
回复
你的目的是什么?

把这个文件内容存放到数据库中去吗?

建议:
文本文件-》数据库-》建立多级索引-》用Select语句从数据库中提取出若干条数据为一批,然后一批一批读,一批一批显示

因为数据库中组织数据比文本文件效率高得多了

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧