Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > сохранение матрицы в файл


Автор: shupg 21.7.2006, 15:28
есть матрица. в ней нули и целые числа ( где-нибудь до 100 ).
я её конечно сохраняю, но она потом из этого файла считывается долго.
надо какой-нибудь цивильный алгоритм, чтобы работало порезвее и весило поменьше.
Есть какие - нибудь дельные идеи, хотя бы в теории? 

Автор: _hunter 21.7.2006, 15:33
сщхраняеш первыми двумя числами длину и высоту матрицы.
читаеш их. и потом за раз читаеш длина*высота элементов 

Автор: shupg 21.7.2006, 21:43
Я  так и делаю... Может есть алгоритмы по хитрее и по быстрее? smile 
Там много повторений. RAR его сжимает в 50 раз!!!
Сжать бы его раз в 20 - тогда заживем! 

Автор: Exception 21.7.2006, 22:04
Определись, что тебе более нужно. "Работало побыстрее" и "весило меньше" далеко не всегда могут сочетаться. 

Автор: Mayk 21.7.2006, 22:21
Цитата(shupg @  21.7.2006,  19:28 Найти цитируемый пост)
есть матрица. в ней нули и целые числа ( где-нибудь до 100 ).
я её конечно сохраняю, но она потом из этого файла считывается долго.

От нуля до ста => элемент матрицы можно хранить в 8 битах.
Матрица на диске хранится в int'ах? Если так, то заменить на char.

Кстати, насколько матрица является разряженной?



Цитата(shupg @  21.7.2006,  19:28 Найти цитируемый пост)
Есть какие - нибудь дельные идеи, хотя бы в теории?  

Ну если есть много свободного времени, можно прикрутить что-нибудь наподобие zlibc, чтобы архивировать по ходу чтения/записи.

Можно попробовать считывать не всю матрицу, а лишь необходимые участки.

Что-нибудь типа
Код

class Matrix{
 Row& operator[](int row) const{
      if (isRowLoaded(row)){
           return rows[row];
      }
       loadRowFromDisk(row);
       return rows[row];

}
}

 


PS. winrar сжал 10 метровый файл сгенерированный 
while(chars--){putchar(rand()%100);    }
до 8 метров. 
Зато для сравнения 10 метровый файл сгенерированный так, как будто писались
int'ы от 0 до 99:
while(chars--){putchar(0);putchar(0);putchar(0);putchar(rand()%100);}
как раз ужался в указанные пять раз, поэтому мне кажется что матрица записывается как последовательность int'ов, а не int8_t, и это можно устранить,
сократив тем самым размер файла на три четверти.
  

Автор: shupg 25.7.2006, 02:32
спасибо за совет Mayk.
помогло в 15,01628664495114006514657980456 раз! 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)