C++坏内存分配异常
C++ bad memory alloc 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分配异常和SQL内存分配异常。当我读取bad_memory alloc异常时,当编译器无法分配新内存时,我读取C++会抛出它。以防万一,如果这有帮助的话,我正在一个6GB RAM的系统上运行它(我必须在6GB RAM中运行,因为这是我们产品支持的最低限度),当这个进程运行时,sqlserver.exe进程几乎占用了4GB的RAM空间。请帮助解决此方法的任何问题或任何可以改进的方法。
@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是连续的,但我认为它们是连续的——因为你正在为这种特定类型的数据使用一个表。
相关文章:
- std::元组分配和复制/移动异常保证
- 从 C# 调用 C++ DLib 会导致错误的分配异常
- 我们应该在抛出异常之前取消分配内存吗
- C++中的内存分配(引发异常:读取访问冲突)
- 如何捕获源自静态分配对象的构造函数的异常?
- 如何实现,错误分配中止而不是抛出异常
- 当有大量内存分配时,如何处理C++编程中的异常
- 从 boost::存档:binary_iarchive 反序列化 std::string 时出现错误的分配异常
- 分配数组时有异常,将其分配为 2D 数组时没有异常
- Qt:如何在QByteArray中调试错误的分配异常
- 如果在构造函数引发异常后释放了分配的内存
- 分配内存后,构造函数处出现未捕获的异常
- 由将值分配给双精度类型的变量而导致的浮点异常
- 在分配scoped_ptr之前处理异常
- C++坏内存分配异常
- 将值分配给字符串向量时的 Cygwin 异常
- 具有空异常规范的运算符new在分配返回0时调用构造函数
- 无效解除分配时的 xmemory0 异常
- 抛出异常后,对象内分配的指针是否自动解除分配
- 通过分配c内存错误捕获c++异常