Прочитайте огромный матричный файл на C - PullRequest
2 голосов
/ 20 января 2012

У меня есть огромная матрица 100,000x100,000 (текстовый файл), которую я использую для вычисления пригодности хромосомы в генетическом алгоритме.Мой размер популяции составляет 100, а размер генерации - 1000. Поэтому я читаю этот файл 100 000 раз.

GA записан в C, и я не знаком с C.Как эффективно читать этот матричный файл в C.Есть ли другой способ, которым я могу оптимизировать это.

Спасибо.

Edit:

Извините, это файл матрицы размером 100 000 X 100 000Я не могу сохранить это в памяти, так как для этого нужно около 37 ГБ.Я хочу читать каждый раз, когда мне это нужно.

Ответы [ 4 ]

4 голосов
/ 20 января 2012

Прочитайте о mmap(), что полезно для больших файлов.

2 голосов
/ 20 января 2012

Что вы знаете о данных в матрице? Являются ли данные в основном нулями, поэтому матрица имеет размер разреженный ? Если это так, то должны быть сохранены только ненулевые элементы. Здесь - это пример библиотеки C для операций с разреженными матрицами.

Есть ли в матрице симметрия ? Если он имеет, например, диагональную симметрию, необходимо сохранить только половину данных.

ИЗМЕНЕНО, чтобы добавить:

Очевидно, что в ваших входных данных нет 37 ГБ математической информации , поэтому большая часть данных в матрице может быть отброшена без ущерба для результата вашей программы. Я предполагаю, что элементы матрицы, меньшие определенного значения, могут быть сброшены в ноль, что может привести к преобразованию вашей матрицы в разреженную матрицу, если она еще не разрежена.

1 голос
/ 20 января 2012

Зачем вам каждый раз перечитывать файл?Вы можете просто прочитать его один раз и сохранить в памяти, так что вам не нужно беспокоиться об оптимизации чтения файла, так как это делается один раз.Предполагая, что это матрица чисел с плавающей точкой и число с плавающей запятой 4 байта, 10000 * 10000 * 4/1024/1024 = 381 МБ

Редактировать: если это 100000x100000, то я думаю, что вы можете масштабировать значения с плавающей точкой в ​​байтах(0-255), таким образом, вам нужно всего 9 ГБ вместо 40 ГБ.

0 голосов
/ 23 января 2012

Как уже писал Алекс Рейнольд, mmap - это способ доступа к файлу. Это просто, быстро и возлагает всю нагрузку на управление памятью на ядро ​​вместо вашего кода.

Кроме того, вам может понадобиться подумать о том, как представлять данные в памяти. Например, если вы анализируете гены AFAIK, есть только четыре типа. Таким образом, вы можете кодировать один ген с 2 битами или 4 генами в одном байте. Таким образом, у вас будет больше работы по извлечению / хранению генов, но вам потребуется «только» 2,5 ГБ для хранения 100 000 x 100 000 записей.

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

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