C++ 坏内存分配异常

C++ bad memory alloc exception

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

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 分配异常和 SQL 内存分配异常。当我阅读 bad_memory alloc 异常时,我读到 C++ 在编译器无法分配新内存时抛出它。以防万一,如果这有帮助,我 运行 在具有 6GB RAM 的系统上运行(我必须使它在 6GB RAM 中工作,因为它是我们产品支持的最小值)并且当此过程运行 sqlserver.exe 进程几乎占用 4GB 内存 space。请帮助解决此方法的任何问题,或者无论如何可以改进它。

@TheDark 在他最后的评论中给出了一个很好的建议。如果是我并且我知道 table 中的计数或者我可以检索数据计数,那么我会执行类似于以下的操作:

// 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 是连续的,但我认为它们是连续的,因为您正在为这种特定类型的数据使用 table。