1

longblob フィールドを持つ mysql テーブルがあります。Blob レコードをテーブルに正常に挿入し、python を使用してディスク上のファイルに抽出しました。

ここで、テーブルから最新バージョンの BLOB を選択し、C++ および mysql コネクタを使用してディスク上のファイルに書き込みたいと考えています。これは私がこれまでに持っているコードです。

小さなブロブでは機能するように見えますが、データベース上の大きなブロブには十分ではありません. 最大バッファ サイズは 1000000 に近いようです。

mysql select から大きな longblob ファイルを書き込むにはどうすればよいですか?

string appname = "rocket.exe"; 

driver = get_driver_instance();
con = driver->connect(mysql_server, mysql_user, mysql_password);
con->setSchema("app");
stmt = con->createStatement();

sqlstring =
    "select installer"
    "  from app_table"
    " where appname = '" + appname + "'"
    "   order by version desc "
    " limit 1";  

std::istream *blob;
res = stmt->executeQuery(sqlstring);
while (res->next()) {
    blob = res->getBlob("installer");
}

char buffer[1000000];
memset(buffer, '\0', 1000000);
blob->read((char*)buffer,1000000);   

std::ofstream outfile ("rocket2.exe",std::ofstream::binary);
outfile.write (buffer,1000000);
outfile.close();

delete res;   // resultset
delete stmt;  // statement
delete con;   // connection 
4

2 に答える 2

2

それは大きなバッファです。スタック領域が不足している可能性があります。メモリ管理を追加するか、ベクトルを使用して、ヒープに割り当てます。約 1000000 を使用できるとおっしゃいました。変動性は、コードの残りの部分で使用されているスタック スペースによるものです。

#include <vector>;
std::vector<char> buffer(1000000, '\0');
blob->read(&buffer[0], buffer.size());

スタック メモリとヒープ メモリの詳細については、こちらこちらをご覧ください。

于 2013-10-13T19:32:17.390 に答える