2015-03-28 7 views
1

Вот суть того, что я пытаюсь сделать. Я храню файлы в таблице SQL. Таблица большая с 400 записями, но каждая запись хранит архив файлов и их размер составляет приблизительно 100 МБ каждый. В последнее время, мы должны были изменить наше шифрование 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 Memory. Пока я читал исключение bad_memory alloc, которое я прочитал, C++ выдает его, когда компилятор не может выделить новую память. На всякий случай, если это помогает, я запускаю это в системе с 6 ГБ оперативной памяти (я должен сделать эту работу в 6 ГБ оперативной памяти, так как это минимально наш продукт поддерживает), и хотя этот процесс выполняется, процесс sqlserver.exe занимает почти 4 ГБ пространства оперативной памяти. Пожалуйста, помогите с любыми проблемами с этим подходом или в любом случае, чтобы его можно было улучшить.

+0

Я не уверен, что здесь много чего, вы исчерпали память. Как правило, решение состоит в том, чтобы использовать меньше памяти. – user657267

+0

Просто чтобы быть ясным - каждая запись составляет 100 МБ, и вы читаете 80 из них в память? Это не подходит для 6GB –

+0

@ TheDark Вы правы. Максимальный размер файла - 100 МБ. По крайней мере, половина файлов меньше. Но я не хочу брать на себя предположения о будущей проверке. Кроме того, это выполняется правильно один раз в 2 или 3 раза. Поэтому я предполагаю, что это проблема памяти. В любом случае, чтобы улучшить процесс здесь? – Crusher

ответ

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 

Это позволит сократить объем используемой памяти на сегодняшний день и избавить себя структуры. Конечно, это будет означать, что ваши идентификаторы смежны, но я полагаю, что они с тех пор, как вы используете таблицу для этого конкретного типа данных.

+0

Спасибо за предложение. Как это изменится, если идентификатор не будет смежным? – Crusher

+1

@Crusher: Если идентификаторы не смежны, я предполагаю, что вы запрашиваете другое условие WHERE. Я бы за пределами цикла выполнял «SELECT ID WHERE X = Y» и сохранял данные в векторе ids без FILEDATA (это должно быть в пределах вашего требуемого размера памяти, так как это будет только вектор ints). Затем используйте vector.size() для настройки циклов for и данных в векторе для запроса таблицы WHERE ID = Vector.at (i). Надеюсь, это имеет смысл ... – ejsd1989

Смежные вопросы