как улучшить производительность чтения байтов построчно из файлового потока - PullRequest
2 голосов
/ 12 июля 2011

У меня есть файл больше 10G.Чтобы читать этот файл построчно, я написал эту функцию.

static IEnumerable<string> fread(string fname, Encoding enc) 
  using (var f = File.OpenRead(fname))
  using (var reader = new StreamReader(f, enc))
    while (!reader.EndOfStream)
      yield return reader.ReadLine();     
}

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

static IEnumerable<byte[]> freadbytes(string fname) {
  using (var f = File.OpenRead(fname)) {
    var bufSz = 1024;
    var buf = new byte[bufSz];
    var read = 1;
    var cr = (byte)13; // \r
    var lf = (byte)10; // \n
    var data = new List<byte>();
    while (read > 0) {
      read = f.Read(buf, 0, bufSz);
      data.AddRange(read == bufSz ? buf : buf.slc(0, read));
      var i = data.IndexOf(lf);
      while (i >= 0) {
        if (i > 0 && data[i - 1] == cr) yield return data.Take(i - 1).ToArray();
        else yield return data.Take(i).ToArray();
        data.RemoveRange(0, i + 1);
        i = data.IndexOf(lf);
      }
    }
  }
}

Вторая функция, freadbytes (), также работает хорошо, но проблема в том, что вторая функция занимает более 10 разпервая функция.Что я могу сделать для второй функции быстрее?

Ответы [ 2 ]

5 голосов
/ 12 июля 2011

Хотя и не проверено, я уверен, что это будет значительно быстрее:

static IEnumerable<byte[]> fread(string fname, Encoding enc) 
{
  using (var f = File.OpenRead(fname))
  using (var reader = new StreamReader(f, enc))
    while (!reader.EndOfStream)
      yield return enc.GetBytes(reader.ReadLine());     
}
0 голосов
/ 12 июля 2011

Может быть, это поможет:

static IEnumerable<string> fread(string fname, Encoding enc) 
  using (var f = File.OpenRead(fname))
  using (var reader = new StreamReader(f, enc))
    while (!reader.EndOfStream)
      yield return enc.GetBytes(reader.ReadLine());     
}

Обновление: изначально пропустил параметр enc.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...