2011-09-19 2 views
1

Я ищу способ переписать функцию Mathematica, которая читает текстовый файл с числовыми значениями (несколько сотен Мб) и создает из него массив Mathematica. Я использую ReadList для чтения файла, и это происходит так быстро, как можно было бы ожидать, но моя проблема заключается в том, как заставить этот массив вернуться к переменной вне этой функции без копирования или чего-то глупого подобного?Функция Mathematica, которая возвращает очень большой массив, очень медленная

В настоящее время моя функция записывается как

LoadData[vars_...]:=Module[{localvars_...},...Return[giant array];]; 

и попытаться присвоить гигантский массив переменной, как это:

table = LoadData[vars_...] 

Однако время, проведенное с массив из «гигантского массива» и поместить его в «таблицу» длиннее, чем файл, сам прочитанный. Ясно, что все это копируется или что-то глупое; он, вероятно, переполнит память, если я перейду к гораздо большему количеству данных.

Как я могу предотвратить это? Как я могу заставить Mathematica просто переименовать массив, а не копировать все данные? В случае, если это имеет значение, функция определяется в отдельном пакете в том, где я его использую.

РЕШИТЬ:

Ааа, спасибо Велизарий, simple question on passing data between functions действительно дает мне подсказку, что нужно, то есть настройки

Attributes[LoadData]={HoldFirst} 

в пакете, как сделать функцию вести себя разумно.

+1

Как вы определили, что проблема с копией была проблемой? – rcollyer

+3

Связанный http://stackoverflow.com/questions/7376032/simple-question-on-passing-data-between-functions –

+0

Я поставил оператор печати непосредственно перед вызовом Return в функции и сразу после присвоения «таблице «в родительском ноутбуке, и потребовалось очень много времени, чтобы перейти от одного к другому. –

ответ

0

Вы также можете внести переменную Dynamic и обновить ее из функции - загрузить данные прямо в нее. Но Unevaluated работает так же хорошо по этой причине.

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