2016-10-18 2 views
2

Так что ошибка, которую я получаю, это.Почему моя память заканчивается, когда файл становится большим?

Необработанное исключение типа «System.OutOfMemoryException» произошло в mscorlib.dll

Я никогда не сталкивался с этой ошибки, прежде чем и я посмотрел его на Google.
У меня есть 64-битная система.
У меня есть 16 ГБ оперативной памяти.

Некоторые люди сказали, что мне нужно установить целевую платформу для x64 в свойствах моего проекта, но не заставит ли это так, что только 64-битные системы смогут запускать это приложение?

public static string RC4(string input, string key) 
{ 
    StringBuilder result = new StringBuilder(); 
    int x, y, j = 0; 
    int[] box = new int[256]; 

    for (int i = 0; i < 256; i++) 
    { 
     box[i] = i; 
    } 

    for (int i = 0; i < 256; i++) 
    { 
     j = (key[i % key.Length] + box[i] + j) % 256; 
     x = box[i]; 
     box[i] = box[j]; 
     box[j] = x; 
    } 

    for (int i = 0; i < input.Length; i++) 
    { 
     y = i % 256; 
     j = (box[y] + j) % 256; 
     x = box[y]; 
     box[y] = box[j]; 
     box[j] = x; 

     result.Append((char)(input[i]^box[(box[y] + box[j]) % 256])); 
    } 
    return result.ToString(); //This would be the line throwing me the error. 
} 

Потому что каждый второй я добавляю новый текст с клавиатуры на текстовый файл. Поэтому давайте скажем, что я набираю abc в первую секунду, когда он добавит, что теперь, если я наберу def в следующую секунду, он добавит это. Все это происходит внутри таймера, так что он действительно прямолинейный. Всякий раз, когда текстовый файл достигает 350 000 КБ, он бросает мне эту ошибку.

+1

Пожалуйста, поделитесь своим фрагментом кода, в котором вы пишете эту строку ввода в файл –

+0

Не используйте RC4 для производственного кода, он не был безопасным методом шифрования в течение нескольких десятилетий. Используйте AES (Advanced Encryption Standard). – zaph

ответ

2

Существует ограничение на то, насколько допустимы большие одиночные объекты, даже на x64. Фактический предел не имеет значения и зависит от конфигурации, но результат заключается в том, что при обработке больших объемов данных вы должны читать данные по частям (обычно через Stream), обрабатывая куски за раз. Никогда не пытайтесь держать все в памяти сразу. Это в равной степени относится к вводу и выводу.

Теперь, если вам удалось загрузить всю вещь в input, вам повезло; но StringBuilder намеренно негабаритный, так что ему не нужно постоянно выделять выделение. Вы можете использовать , чтобы «исправить» ваш код, указав StringBuilder правильное количество символов, которое вам нужно в конструкторе, но это только временный хак, который позволит вам обрабатывать несколько большие данные. Исправление real заключается в том, чтобы не пытаться обрабатывать огромные данные в одном куске.

+0

Я немного обеспокоился при использовании RC4-алгоритма, я сразу увидел, что он сгенерировал waaaay на много. Есть ли другие методы шифрования, которые вы бы рекомендовали? Сознание простое и безопасное. –

+0

@ JohnS.Washington RC4 - это потоковый шифр; используется * правильно * (потоковая передача, не все одновременно), это должно быть хорошо. Основная причина не использовать RC4 заключается в том, что он имеет несколько известных уязвимостей. –

+0

Да, я читал об этом, а все остальное, что вы порекомендовали бы, было бы более безопасным? –