Как избежать многократного чтения очень большого массива в Matlab? - PullRequest
1 голос
/ 02 апреля 2012

У меня есть большой массив / матрица с 5899091 строками и 11 столбцами. Я храню его в текстовом файле. Используя метод dlmread () в matlab, я читаю его каждый раз, когда мне это нужно. Тем не менее, это занимает много времени (более 1 минуты). И мне нужно читать файл снова и снова. Я застрял в этой ситуации. Мой вопрос:

1) Есть ли способ прочитать файл только один раз и сохранить его в любой глобальной / постоянной матрице?

2) Есть ли лучший способ прочитать текстовый файл и преобразовать его в матрицу более эффективным способом?

Заранее спасибо.

Ответы [ 4 ]

1 голос
/ 02 апреля 2012

Вы можете получить желаемую производительность из файла с отображением в памяти. Исследуйте функцию Matlab memmapfile. Это не то, чем я пользуюсь, поэтому не буду предлагать дальнейших советов, которые, вероятно, будут неправильными.

1 голос
/ 02 апреля 2012

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

Вы также можете сохранить переменную в файле MAT. Если каждый элемент в вашем файле имеет тип double, его размер должен превышать 4 ГБ. Формат MAT эффективен, но главное преимущество заключается в хранении ваших чисел в виде чисел, а не текста. С 5 или 8 значащими цифрами одинаковые числа в ASCII занимают 6,2 или 9,3 ГБ соответственно.

Если по какой-то причине вы действительно не хотите передавать данные как переменную, я бы порекомендовал вложенные функции над глобальными переменными:

function aResult = aFunction(var)

    data = dlmread(...);

    var4 = bFunction(var);

    function bResult = bFunction(var)

        var4 = cFunction(data);

    end

end

Конечно, в этот момент вы все еще оборачиваете бизнес-функции во что-то. полезные правила полезны.

Теперь, если проблема real - это просто размер этого файла, то есть он слишком велик для памяти, и вы используете аргументы диапазона для dlmread для доступа к файлу в виде кусков - тогда вы вероятно, потребуется для разработки формата для использования с memmapfile. Эта страница Википедии объясняет потенциальные выгоды.

Тогда есть решение о грубой силе .

0 голосов
/ 02 апреля 2012

Вы можете прочитать файл один раз и сохранить его в MAT-файле MATLAB. Затем вы можете получить доступ к сохраненным переменным полностью или частично (в основном, как любая переменная в рабочем пространстве MATLAB) непосредственно из файла, используя MATFILE . Я ответил на аналогичный вопрос об этом here . Пожалуйста, посмотрите.

0 голосов
/ 02 апреля 2012
  1. Вы хотите использовать глобальные переменные.Объявите глобальный в верхней части функции, и он будет использоваться функциями, в которых он объявлен: см. http://www.mit.edu/people/abbe/matlab/globals.html
  2. Используйте файл .mat.Это будет немного быстрее.Кроме того, если матрицу легко создать (большая личность или глазная матрица), возможно, ее будет быстрее создать на лету.Наконец, если ваша матрица разрежена, используйте операции разреженной матрицы.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...