2009-09-02 3 views
3

У меня есть большой файл (60mb), и я читаю файл в строку, а Iam возвращает эту строку другому методу.Есть ли способ прочитать большой текстовый файл по частям?

Теперь, когда я читаю файл в строку, вы получаете исключение System out of memory.

Есть ли способ прочитать файл по частям и добавить его в строку? Если нет пути вокруг этого?

static public string Serialize() 
{ 
    string returnValue; 
    System.IO.FileInfo file1 = new FileInfo(@"c:\file.txt"); 
    returnValue = System.IO.File.ReadAllText(file1.ToString()); 
} 
+1

см. Аналогичный вопрос: http://stackoverflow.com/questions/247066/reading-and-parsing-files-in-net-performance-for-hire – Cleiton

+0

просто nitpick: ваш метод должен читать: Deserialize() Сериализация - это сохранение, десериализация загрузки. – Dabblernl

+0

Да. Ты прав. Моя ошибка> – shanthiram

ответ

6

Как вы прочитать файл прямо сейчас? Вы можете использовать класс StreamReader и читать файл по строкам (метод ReadLine).
Вы также можете прочитать определенное количество байтов из файла при каждой операции чтения (метод чтения)

+0

Спасибо за ответ. Я должен был попробовать это раньше. – shanthiram

+0

Проблема здесь, так как я новичок, мне нужно сохранить эту строку в другой файл с шифрованием. – shanthiram

+0

@ shanthiram- затем посмотрите на что-то вроде CryptoStream. В любом случае вы захотите использовать Stream. http://msdn.microsoft.com/en-us/library/system.security.cryptography.cryptostream.aspx – RichardOD

3

Да, это называется потоковая передача. Посмотрите на StreamReader Class. Хотя я не уверен, почему вы хотите 1 60MB в одной строке. Наверное, лучше всего поработать с ним немного, если это возможно (возможно, в вашем сценарии по строке за строкой?).

Вместо ReadAllText смотреть на OpenRead и прохождение возвращенного FileStream в конструктору StreamReader, посмотреть на что-то делать в этом направлении, если возможно:

using (FileStream fs = File.OpenRead("c:\theFile.text")) 
    using (StreamReader sr = new StreamReader(fs)) 
    { 
     string oneLine = sr.ReadLine(); 
    } 
+0

Я пробовал это и все еще выдавал исключение из памяти из памяти. – shanthiram

+0

ОК - тогда я думаю, если вы все еще загружаете все это в память в одну строку. Это плохая идея. Если вы делаете шифрование, как вы говорите, то посмотрите на http://msdn.microsoft.com/en-us/library/system.security.cryptography.cryptostream.aspx. – RichardOD

1

, даже если вы прочитали его по строкам (или по частям потоковым потоком), у вас не хватит памяти, поскольку вы присоединяют его к одной строке. сжимает его по пути вариант? если нет, я бы, вероятно, увеличил maxHeap для JVM до 512 МБ или аналогичный.

+0

Это допустимая точка, но shanthiram не использует Java, а C#. – RichardOD

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