在csdn上面看了N多的文章,在讨论文本文件导入到数据库,其中涉及到最重要的问题,莫过于效率问题了。导入的过程中,一般认为有两个瓶颈:1、read和readln的I/O读写效率问题;
2、数据库的Append 或者insert效率问题。一般来说,对于第二种,大家都会提出来,使用insert的时候,不要单独提交一条,而是要批量提交N条进行处理。至于还有没有进一步的方法,所说的就不多了。
这里有一个值得质疑的地方,就是TQuery里面的SQL属性,能够支持过多的SQL语句么?这样在数据库服务器端执行程序的时候会不会出问题?比如SQL命令过长?
对于第一点,很多人又提出来不要使用readln一行一行地读,而是要批量地读入,或者是使用TstringList或者TMemo这样的loadfromfile方法。使用loadfromfile这样的方法,有一个很大的局限性,就是,当文件比较大的时候,比如我经常要处理的文本文件一般都高达600MB的,适用这个方法,基本上程序就相当于死机了。
不知道大家有没有什么好的方法,批量地读入呢?我曾经想到过blockread,但是好像没有办法在buffer里面读出一行行的纪录。唉,谁有好的方法,请跟帖讨论吧。最好是写出具体的代码。

解决方案 »

  1.   

    我以前也是用的你所说的方法,效率确实很低,现在我是直接调用 MSSQL 的DTS服务来进行数据导入,由于MS对DTS做了专门的优化,导入速度很快,所以如果你的文本文件中的内容是规则的话,建议你用程序调用DTS来导入数据,不过它要求程序运行的计算机上装有DTS服务。
      

  2.   

    to ffjf:
    我没有办法适用dfw的全文检索,你能够帮忙帖出来那个帖子么?另外,希望有人说说我提出的几个问题啊。还有,DTS的调用是通过什么来进行啊?有没有函数式或者是API方式的接口?
      

  3.   

    使用流方式进行读是最快的,TFileStream.
    我现在就用这种方式读DBF文件,将它导入到ORACLE中
      

  4.   

    经过几次的试验,我发现,实际上真正拖慢操作的不是对字段的划分以及对文件的读写,而是在插入记录到数据库的过程。
    我使用过dataset的方式进行插入,也使用过直接传递insert命令到服务器段执行,结果都一样是很慢的,大概用了两分多钟,导入一个2Mb的文本文件。而我注释掉插入数据库的命令之后,对整个文本的分析,只用了2秒钟!sigh
    优化看来插入数据库的过程,才能够真正提高效率。
    关键在此,有哪位高手推荐一些方法?探讨一下吧?
      

  5.   

    具体和每一种数据库有关,
    Oracle 8.0.5+Linux
    client Piii700+128M
    server HP lh6000,1G mem,one 700M CPU,100M Nic
    平均每秒2000条,记录长度平均100 BYTE
      

  6.   

    我在sql2000里写的存储过程,是把文本文件导入数据库的:
    我没怎么写过存储过程,大家见笑了,不过可以用,也是批量插入的。/****** Object:  Stored Procedure dbo.charu    Script Date: 2004-3-7 9:11:12 ******/
    CREATE PROCEDURE dbo.charu 
    @path varchar(50),--文本文件路径
    @file varchar(50),--文件名
    @username varchar(50)
    AS
    set nocount on
    declare @aaa varchar(1000)
    declare @bbb varchar(1000)
    declare @ccc varchar(1000)
    set @aaa='''Driver={Microsoft Text Driver (*.txt; *.csv)};DefaultDir='+@path+';'''
    set @ccc='''select * from '+@file+''''
    set @bbb='insert into car_info(cardnum,cartype,carbrand,carnum,color,zhuitao,drivername,shenfenzheng,dradress,phonenum,cardate,moneynum)
    select *  from OpenRowset('+'''MSDASQL'''+','+@aaa+','+@ccc+')'
    exec (@bbb)set nocount offGO
      

  7.   

    To zjqyb(风清扬*任它溺水三千,我只取一瓢饮*)具体和每一种数据库有关,
    Oracle 8.0.5+Linux
    client Piii700+128M
    server HP lh6000,1G mem,one 700M CPU,100M Nic
    平均每秒2000条,记录长度平均100 BYTE
    ------------------你的这个是怎么样实现的阿?