使用oracle occi和c++转储1300万行到一个文件



我试图将数据从数据库中的表导出到csv格式的文件。我想出了下面的程序。我的表包含大约13 million行,这个程序非常慢。

我怎样才能加快这个程序?

#include <iostream>
#include <occi.h>
#include <stdlib.h>
#include <fstream>
using namespace std;
int main()
{
    oracle::occi::Environment* environment;
    oracle::occi::Connection *con;
    oracle::occi::Statement* stmt;
    oracle::occi::ResultSet* res;
    try
    {
        ofstream outfile;
        outfile.open("example.txt");
        string user ; cin>>user;
        string pass ; cin>>pass;
        string instance ; cin >>instance;
        environment = oracle::occi::Environment::createEnvironment(oracle::occi::Environment::DEFAULT);
        con = environment->createConnection(user,pass,instance);
        string query = "SELECT A,B FROM TABLE_X";
        stmt = con->createStatement(query);
        res = stmt->executeQuery();
        while (res->next())
        {
                outfile<<res->getInt(1)<<','<<res->getInt(2)<<'n';
        }
        outfile.close();
        stmt->closeResultSet(res);
        con->terminateStatement(stmt);
        environment->terminateConnection(con);
    }catch(oracle::occi::SQLException &e){
        std::cout<<e.what();
    }
 return 0;
}

使用数组读取来减少数据库往返。以下内容来自这里。在下面的例子中,我将尝试20,50,100,1000的值来找到"NumROws"的最佳值。

例11-1如何对ResultSet使用Array Fetch
ResultSet *resultSet = stmt->executeQuery(...);
resultSet->setDataBuffer(...);
while (resultSet->next(numRows) == DATA_AVAILABLE)
   process(resultSet->getNumArrayRows() );

这会导致为每个数据获取最多numRows的数据量列。使用setDataBuffer()接口指定的缓冲区应该足够大,至少可以容纳numRows的数据

另一种策略是按范围拆分任务,并让这些任务并行运行。如果导出数据必须在单个文件中,则可以将它们分开合并(cat file1 file2> file)。

要写入的文件系统是什么?它慢吗?你试过给别的地方写信吗?正在向其写入输出的文件系统。

我不知道什么叫慢。但是,独立于数据库提取之外,使用write()代替operator<<可以显著提高文件i/o的写入性能。

在我可怜的win8 pc上编写100万个随机csv对的小基准测试显示如下性能:

operator<<  outputs at a rate of 7 Mb/s
write()     outputs at a rate of 40 Mb/s

快了5倍多,即1300万个条目大约30秒。

里面的代码看起来很难看,所以你可以看看它是否值得:

    os << x << ',' << y << 'n'; 

    p=itoa(x, buff, 10); 
    while(*p)
        p++; 
    *p++ = ',';
    itoa(y, p, 10); 
    while(*p)
        p++;
    *p++ = 'n'; 
    *p++ = '';
    os.write(buff, p - buff); 

,其中buff是在循环外分配的缓冲区。

相关内容

  • 没有找到相关文章

最新更新