Задать вопрос
KoshakSB
@KoshakSB
студент ггту сухого

Как обработать данные(файл с данными на 14гб)?

Я для обработки юзаю можно сказать только эти алгоритмы:
public int LoadDataB(string fileName)
  {
      var data = new List<float>();
      using (StreamReader reader = new StreamReader(fileName))
      {
          string line;
          while ((line = reader.ReadLine()) != null)
          {
              if (float.TryParse(line, out float value))
              {
                  data.Add(value);
              }
          }
      }
      sizeSLAU = data.Count;
      b = data.ToArray();
      x = new float[sizeSLAU];
      return 0;
  }
  

  public int LoadDataA(string fileName, int sizeOfBlock = 1000)
  {
      int error = 0;

      if (sizeSLAU > 0)
      {
          float[,] data = new float[sizeSLAU, sizeSLAU];
          using (FileStream fs = File.OpenRead(fileName))
          {
              byte[] buffer = new byte[16];
              for (int i = 0; i < sizeSLAU; i++)
              {
                  for (int j = 0; j < sizeSLAU; j++)
                  {
                      fs.Read(buffer, 0, buffer.Length);
                      float number = float.Parse(Encoding.UTF8.GetString(buffer));
                      data[i, j] = number;
                  }
                  fs.Read(buffer, 0, 2);
              }
          }
          A = data;
      }
      else error = -1;

      return error;
  }


с чтением малых файлов проблем не возникло, но загвоздка в том, что 3-ий тест на 14гб и мне просто выбивает:
An error occurred: Выдано исключение типа "System.OutOfMemoryException".

По ссылке архив с тестами:
https://drive.google.com/file/d/1b8qxwrlmwuiTqLl8Gp-jClWrI2f3mN7v/view?usp=sharing

По ссылке архив с проектом:
https://drive.google.com/file/d/13pE0wxl5sHmWRzOx7CukMx-ZR4oDAuPc/view?usp=sharing


Помогите пожалуйста.
  • Вопрос задан
  • 50 просмотров
Подписаться 1 Простой 2 комментария
Пригласить эксперта
Ответы на вопрос 2
VoidVolker
@VoidVolker Куратор тега C#
Dark side eye. А у нас печеньки! А у вас?
Либо увеличить объем памяти машины, на которой производите расчёты либо оптимизировать ваши алгоритмы по потребляемой памяти.
Ответ написан
OutOfMemory возникает, когда у тебя не хватает оперативной памяти.
Во-первых, Убедись, что у тебя приложение 64-битное.
Во-вторых, большие объёмы данных все сразу в оперативку записывать не стоит. Тем более дважды, как у тебя происходит в LoadDataB.
1. У тебя на Add каждый раз реаллокации данных происходят. Лучше 1 раз с запасом выделить место. Можно, например, сначала 1 раз прочитать файл, чтобы подсчитать количество строк, а потом уже заполнить.
Или можно сделать связный список из чанков, тогда можно будет в 1 проход.
2. ToArray копирует целиком List. Раз начал работать с листом - продолжай.

Если исправишь эти два момента - скорее всего памяти тебе будет уже хватать.
Если всё ещё будет не хватать - либо добавляй больше оперативки, либо подумай над алгоритмом ещё раз, чтобы обрабатывать всё по частям.

UPD: видимо, это какая-то алгоритмическая задача, раз есть ограничение в 1мб.
Тогда сразу иди думай над другим алгоритмом. Читай файл и одновременно делай все вычисления. Нивкакой массив промежуточные данные не сохраняй.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы