这是我要做的事情的要点。我将文件存储在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空间。请帮助解决这种方法的任何问题,或者无论如何都可以改进。
答案 0 :(得分:2)
// 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是连续的,但是我知道它们是因为你正在使用表来获取这种特定类型的数据。