C ++坏内存分配异常

时间:2015-03-28 23:37:58

标签: c++ sql multithreading performance exception

这是我要做的事情的要点。我将文件存储在SQL表中。该表很大,有400条记录,但每条记录都存储文件存档,每条记录的大小约为100MB。最近,我们不得不改变我们的加密密钥。所以我正在编写一个线程(5个线程)代码,使用传统密钥解密,然后使用新密钥加密。这就是每个线程的作用

struct DataToReencrypt
{
     int id;
     string data;
}
vector<DataToReencrypt> results;

// database open
SELECT ID,FileData From Files WHERE ID BETWEEN 1 AND 80 // 81-160 and so on.
// database connection close

// database connection open
for(int i=0;i<results.size();i++ )  // results contain the result of the above query.
{
    string decrypted = LegacyDecryption(results[i].FileData);
    string encrypted = NewEncryption(decrypted);

    UPDATE Files SET FileData = encrypted WHERE ID = results[i].ID;
}
// database connection close

问题是当我尝试这样做时,我得到了这个C ++ bad_memory alloc异常以及SQL内存分配异常。当我阅读bad_memory alloc异常时,我读到C ++会在编译器无法分配新内存时抛出它。如果这有帮助,我在具有6GB RAM的系统上运行它(我必须在6GB RAM中工作,因为它是我们产品支持的最小值)并且在此过程运行时sqlserver.exe进程几乎接近4GB RAM空间。请帮助解决这种方法的任何问题,或者无论如何都可以改进。

1 个答案:

答案 0 :(得分:2)

@TheDark在他的最后评论中提出了一个很好的建议。如果是我,我知道表中的计数或我可以检索数据计数,那么我会做类似以下的事情:

// database connection open
for(int i=0;i<80;i++ )  // ...160...240...etc for each thread
{
    string data;

    SELECT ID,FileData From Files WHERE ID = i // 81-160 and so on.

    // data = FileData from query

    string decrypted = LegacyDecryption(data);
    string encrypted = NewEncryption(decrypted);

    UPDATE Files SET FileData = encrypted WHERE ID = i;
}
// database connection close

这将减少远远使用的内存量并摆脱结构。当然这意味着你的id是连续的,但是我知道它们是因为你正在使用表来获取这种特定类型的数据。