none
有关大量数据(>70,000,000个integer)导入Access的问题 RRS feed

  • 问题

  • 大家好!

    我最近做的一程序遇到了一些麻烦,

    就是如何才能比较快地将文本文件中的70,000,000多个integer数据导入Access中的一个表文件中。

    由于本人没有深入学习过数据库编程,所用的方法也是照搬现成的:

    先用ADOX建立一个Access文件,然后再在其中新建一个表。导入时用如下代码:

     

    Code Snippet

    Do While True
            str = sr.ReadLine                          ' 从一个文本文件中按行取出数据
            If str = Nothing Then Exit Do              ' 未到文件尾则继续执行
            inpNewRow = m_dtMyTable.NewRow             ' 在表中新建一行
            inpNewRow("Friction") = Val(str)     ' 将前面获取的数据写入该行的"Friction"字段列中
            m_dtMyTable.Rows.Add(inpNewRow)            ' 将该行加入当前表
            m_daDataAdapter.Update(m_dtMyTable)        ' 更新表中内容

    Loop

     

     

     

     

    调试发现,无论是把最后的UPDATE放到循环中还是循环外,这一过程都是出奇的慢,且极占开销。

    当然,如果把UPDATE放到循环外,内存的开销还会不断增大。

     

    查了一些资料,可是没有找到比较有效的解决方法。写入速度仍无法明显加快,且极导致易死机。

     

    望各位不吝赐教,深表谢意!

    2008年6月7日 1:34

答案

  • 如果不是必须用编程来完成的话,可以尝试access的导入功能,也许会快不少。

     

    言归正传,ado中用new row + update的方法来插入数据是很划不来的,开销很大,而且也没用到row的功能。换一种导入方式,也就是直接写插入数据的sql。比如 

     

     insert into A (Friction) values (str) 

     

    而且你在txt文件里获取的是str类型,可以直接组合sql语句,不用转换成int。之后利用 DataCommand.Execute(sql)的方法来插入数据,无论从速度或者资源消耗上都要好很多。

     

    2008年6月9日 17:34

全部回复

  • 没人应。。。

    自个儿先顶一顶。。。

    2008年6月9日 15:49
  • 如果不是必须用编程来完成的话,可以尝试access的导入功能,也许会快不少。

     

    言归正传,ado中用new row + update的方法来插入数据是很划不来的,开销很大,而且也没用到row的功能。换一种导入方式,也就是直接写插入数据的sql。比如 

     

     insert into A (Friction) values (str) 

     

    而且你在txt文件里获取的是str类型,可以直接组合sql语句,不用转换成int。之后利用 DataCommand.Execute(sql)的方法来插入数据,无论从速度或者资源消耗上都要好很多。

     

    2008年6月9日 17:34