Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 处理数据集中的大型XML文件(内存不足)_Vb.net_Dataset_Out Of Memory - Fatal编程技术网

Vb.net 处理数据集中的大型XML文件(内存不足)

Vb.net 处理数据集中的大型XML文件(内存不足),vb.net,dataset,out-of-memory,Vb.net,Dataset,Out Of Memory,我试图通过URL读取一个1GB的XML文件,该文件包含近100万条记录,并将存储在数据集中并保存到数据库中,但10分钟后,应用程序将崩溃并抛出内存不足异常 XML如下所示: Sub Main(): 类模块1 公共共享子主目录() 将url设置为字符串=”http://data.Icecat.biz/export/freexml/EN/daily.index.xml" ProcessXMLFeedURL(url) 端接头 末级 功能: 公共共享函数ProcessXMLFeedURL(MyUR

我试图通过URL读取一个1GB的XML文件,该文件包含近100万条记录,并将
存储在数据集中并保存到数据库中,但10分钟后,应用程序将崩溃并抛出
内存不足异常

XML如下所示:


Sub Main():

类模块1
公共共享子主目录()
将url设置为字符串=”http://data.Icecat.biz/export/freexml/EN/daily.index.xml"
ProcessXMLFeedURL(url)
端接头
末级
功能:

公共共享函数ProcessXMLFeedURL(MyURL作为字符串)作为布尔值
Dim OK作为布尔值=False
尝试
Dim rssReq As WebRequest=WebRequest.Create(MyURL)
将用户名设置为字符串=“”
将密码设置为字符串=“”
Dim编码为String=System.Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(用户名+“:”+密码))
rssReq.Headers.Add(“授权”、“基本”+编码)
“//获取WebResponse
Dim rep As WebResponse=rssReq.GetResponse()
“//在XMLTextReader中读取响应
Dim xtr As XmlTextReader=新的XmlTextReader(rep.GetResponseStream())
“//设置与SQL server的连接
将MyConnectionString设置为String=“数据源=…”
作为SqlConnection的Dim连接=新的SqlConnection(MyConnectionString)
Dim MyServer As Server=新服务器(新服务器连接(连接))
Dim db As Database=新数据库(MyServer,“xxxxxx”)
db.Create()
“//创建新的数据集
Dim ds As数据集=新数据集()
ds.ReadXml(xtr)
“//解析表
把我的桌子调暗为桌子
Dim MyTableName为String=ds.Tables(1.TableName)
如果没有HaveTable(MyConnectionString,MyTableName),则
“//创建表
尝试
Mytable=新表(db,MyTableName)
特例
Dim ii作为整数=0
结束尝试
“//创建列
Dim Mycolumn As Column=新列()
对于ds.表(1).列中的每个dc As数据列
Mycolumn=新列(Mytable,dc.ColumnName)
Mycolumn.DataType=getdatatype(dc.DataType.ToString)
Mytable.Columns.Add(Mycolumn)
下一个
Mytable.Create()
Dim PrimaryKeys()作为DataColumn=ds.Tables(1.PrimaryKey)
Dim PrimaryKey作为数据列
对于PrimaryKeys中的每个PrimaryKey
Dim Myindex As Index=新索引(Mytable,PrimaryKey.ColumnName)
Myindex.IndexKeyType=IndexKeyType.DriPrimaryKey
添加(新的IndexedColumn(Myindex,PrimaryKey.ColumnName))
Mytable.index.Add(Myindex)
下一个
如果结束
使用MyConnection作为SqlConnection=newsqlconnection(MyConnectionString)
MyConnection.Open()
将bulkcopy用作SqlBulkCopy=新的SqlBulkCopy(MyConnection)
bulkcopy.DestinationTableName=“[databasename].[dbo].[“+MyTableName+”]”
尝试
bulkcopy.WriteToServer(ds.Tables(1))
特例
Dim iw为整数=0
结束尝试
终端使用
MyConnection.Close()
终端使用
特例
抛出ex'//在这里做错误处理
结束尝试
返回OK
端函数

由文本组成的1GB xml文件比加载到内存时占用的磁盘空间要大得多,特别是当您序列化到CLR对象时,但您看不到这样做的价值。另外,您的对象至少有2GB的限制,这样绝对不会耗尽内存。您正在处理的
类是什么?实际上什么时候内存耗尽,即代码中的什么位置?