2012-01-20 2 views
2

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

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

спасибо.

Edit:

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

+4

Надеюсь, у вас много оперативной памяти, если вы используете 32-битные целые числа, 100 копий вашей матрицы занимают 40 ГБ памяти. – GWW

+3

Зачем вы его читаете 100 000 раз? Изменен ли файл между чтениями? – DarkDust

+0

Мне это не показалось, как будто он планировал провести кучу копий матрицы - сама матрица не меняется, не так ли? - но он явно планирует читать его несколько раз. Также непонятно - почему вы не можете просто сохранить его в памяти? –

ответ

1

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

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

+0

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

+0

Это 100 000 x 100 000, а не 10 000 x 10 000. –

+0

Я вижу, тогда нет, я не думаю, что есть способ избежать обмена, даже при использовании mmap. Однако вы можете масштабировать значения с плавающей запятой до байтов (0-255) таким образом, вам нужно всего 9 ГБ вместо 40 ГБ – iabdalkader

4

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

2

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

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

отредактирован добавить:

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

0

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

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

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

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