求助——程序内存占用超大

丶Xiang 2011-06-26 01:22:45
我自己写个程序,主要是用来读写程序的,编译以后我悲剧的发现内存占用超大,多达1G郁闷。。。
请各位高手帮帮忙啊。代码贴出来大家看看。

Module Type

Structure TaskInfo
<VBFixedString(17)> Public Title As String
Public int1 As Integer
Public int2 As Integer
<VBFixedArray(3)> Public ID() As Byte
Public int3 As Integer
Public int4 As Integer
<VBFixedArray(4)> Public b1() As Byte
<VBFixedArray(4)> Public b2() As Byte
<VBFixedArray(4)> Public b3() As Byte
<VBFixedArray(4)> Public b4() As Byte
<VBFixedArray(4)> Public b5() As Byte
<VBFixedArray(4)> Public b6() As Byte
<VBFixedArray(4)> Public b7() As Byte
<VBFixedArray(4)> Public b8() As Byte
<VBFixedArray(4)> Public b9() As Byte
<VBFixedArray(4)> Public b10() As Byte

End Structure

End Module

这个是定义数据类型的模块
然后我这样读取
Module FuncTask

Function GetTaskList() As TaskInfo()
Dim TempList() As TaskInfo
Dim i As Long
Dim Size As Long
Dim FileList() As String

ReDim TempList(0 To CLng("&HFFFFFF"))
FileList = System.IO.Directory.GetFiles(Application.StartupPath & "\task\")
For i = 0 To UBound(FileList) - 1
If System.IO.Path.GetExtension(FileList(i)) = ".qed" Then
TempList(Size) = GetInfo(FileList(i))
Size = Size + 1
End If
Next
ReDim Preserve TempList(0 To Size)
Return TempList
End Function

Function GetInfo(ByVal FilePath As String) As TaskInfo
Dim TempTask As TaskInfo

Try
FileOpen(1, FilePath, OpenMode.Binary, OpenAccess.Default)
FileGet(1, TempTask, 1)
Catch ex As Exception
MsgBox("Error:0x00000001" & Chr(9) & Chr(13) & "Open files error" & Chr(13) & "Log:" & Chr(13) & "-------------------------------" & Chr(13) & "File Path:" & Chr(13) & FilePath & Chr(13) & Chr(13) & "Function:" & Chr(13) & "GetInfo()", MsgBoxStyle.OkOnly + MsgBoxStyle.Critical, "Error")
End
End Try
FileClose(1)
Return TempTask
End Function

End Module

读取1700个文件后内存占用竟然有1G。。。。
...全文
79 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
ycproc 2011-06-26
  • 打赏
  • 举报
回复
看看 。。 lz很强大
丶Xiang 2011-06-26
  • 打赏
  • 举报
回复
自己解决了,原来开始不要定义那么大的临时数组就可以了。

Function GetTaskList() As TaskInfo()
Dim TempList() As TaskInfo
Dim i As Long
Dim Size As Long
Dim FileList() As String

ReDim TempList(0 To CLng("&HFFFFFF"))
FileList = System.IO.Directory.GetFiles(Application.StartupPath & "\task\")
For i = 0 To UBound(FileList) - 1
If System.IO.Path.GetExtension(FileList(i)) = ".qed" Then
TempList(Size) = GetInfo(FileList(i))
Size = Size + 1
End If
Next
ReDim Preserve TempList(0 To Size)
Return TempList
End Function

这里要改成

Function GetTaskList() As TaskItem()
Dim TempTaskList() As TaskItem
Dim i As Long
Dim Size As Long
Dim FileList() As String

FileList = System.IO.Directory.GetFiles(Application.StartupPath & "\task\")
ReDim TempTaskList(0 To UBound(FileList))
For i = 0 To UBound(FileList) - 1
If System.IO.Path.GetExtension(FileList(i)) = ".qed" Then
TempTaskList(Size).FileName = FileList(i)
TempTaskList(Size).TaskInfo = GetInfo(FileList(i))
Size = Size + 1
End If
Next
ReDim Preserve TempTaskList(0 To Size)
Return TempTaskList
End Function

就可以了。

只是不知道为什么局部变量不能在函数结束的时候清空,郁闷。。。
丶Xiang 2011-06-26
  • 打赏
  • 举报
回复
楼上两位没明白我意思啊,程序是这样的:
在一个目录里有1700个左右的文件,每个文件代表一条数据,然后我程序启动的时候会检索这个目录里的所有文件,然后从中读取ID,Title等一系列数据,然后在一个ListView中列出来。

按照这条思路的话我就用了FileOpen、FileGet、FileClose来操作。主要过程是

启动程序 -> 声明&HFFFFFFF大小的TaskInfo型的数组 -> 枚举并读取文件 { FileOpen文件 -> FileGet数据存到刚声明的数组中 -> FileClose文件 } -> 显示在ListView中

我算了一下 TaskInfo数据类型的大小是87字节 1700个的话也就 144 KB 这样算上程序的开销,最大20M,也不至于到占用1G的地步。我就郁闷在这里,怎么都搞不定
bdmh 2011-06-26
  • 打赏
  • 举报
回复
1700个文件内容都读到内存,不大才怪,有必要都保留在内存吗
  • 打赏
  • 举报
回复
1700个文件读到内存?那么你使用64位系统吧。

这是人脑出现的问题,只能从根源上重新考虑思路。

16,554

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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