Программа FORTRAN не может прочитать все данные в массив, ограничение по размеру?

У меня есть файл csv, содержащий около 2 миллионов строк и около 150 столбцов данных. Общий размер файла составляет около 1,3 ГБ. Это около 300 миллионов членов массива.

Я начал с файла из 3,5 миллионов строк и методом проб и ошибок понял, что FORTRAN даже не скомпилируется, если массив не определен в 3,9 миллиона или меньше. 4 миллиона, не ходи. Ошибка шины/дампы ядра.

Так или иначе, я думал, что мой файл с 2 миллионами строк будет работать. Я прочитал несколько сообщений о лимите в 2 ГБ. Однако, когда я распечатываю номер строки при чтении данных, я получаю только 250 000 или около того, прежде чем он просто закончится. Как ни странно, у меня есть почти идентичный файл (использовал команду разделения), и он достигает только 85 000, прежде чем вырубиться. Не уверен, почему так по-разному, одинаковое количество символов в строке.

Могу ли я что-нибудь сделать, чтобы прочитать эти данные? Было бы большой проблемой собирать все данные сотни раз.


person user1770223    schedule 24.10.2012    source источник
comment
На какой системе вы работаете? Как вы компилируете свою программу? Пожалуйста, покажите соответствующий исходный код и команду компиляции. Если в Linux, вы компилировали с помощью gfortran -Wall -g, запускали ли вы под отладчиком gdb?   -  person Basile Starynkevitch    schedule 24.10.2012
comment
Я скептически отношусь к необходимости читать такой большой файл в память одним глотком; как правило, гораздо лучше читать большие наборы данных по частям: читать часть, выделять некоторые данные, отбрасывать часть, повторять. Но если вам нужно читать большие наборы данных, сделайте себе одолжение и сохраните их в двоичном формате, то есть unformatted на Фортране.   -  person High Performance Mark    schedule 24.10.2012
comment
@HighPerformanceMark - разве stream доступ не был добавлен в стандарт в одной из последних версий? Это еще один двоичный формат, который занимает меньше места на диске, чем unformatted, и при этом достаточно прост для понимания...   -  person mgilson    schedule 24.10.2012
comment
@mgilson: хорошее замечание, хотя я защищаю свою небрежность, указав, что доступ stream можно использовать для файлов formatted и unformatted, так что это, строго говоря, не альтернатива ни тому, ни другому.   -  person High Performance Mark    schedule 24.10.2012


Ответы (1)


Это свойство не Fortran как такового, а вашего конкретного компилятора и ОС. Вот почему вы должны предоставить эту информацию.

Что касается ошибки шины: вероятно, массив помещается в стек, и у вас закончилось место в стеке. Различные ОС предоставляют способы увеличения размера стека. Многие компиляторы предоставляют опции для размещения больших массивов в куче. Вы также можете попробовать объявить массив «распределяемым» и выделить его. Последнее предложение предполагает, что вы используете компилятор Fortran 95, а не FORTRAN 77.

Существует также способ объявления целочисленной переменной, используемой для индексации. Если цикл в вашей программе превышает 2 147 483 647, вам нужно будет использовать переменную размером более четырех байтов. Мы можем только догадываться, поскольку вы не показываете исходный код.

person M. S. B.    schedule 24.10.2012