2012-01-26 16 views
9

Próbuję napisać tablicę do pliku, gdzie mam otwarciu pliku w ten sposób:Fortran I/O: Określanie dużą rekord wielkości

open(unit=20, FILE="output.txt", form='unformatted', access='direct', recl=sizeof(u)) 

tu u jest tablicą i sizeof(u) jest 2730025920, której to ~ 2,5 GB. Po uruchomieniu programu pojawia się błąd Fortran runtime error: RECL parameter is non-positive in OPEN statement, co moim zdaniem oznacza, że ​​rekord jest zbyt duży.

Czy istnieje sposób, aby sobie z tym poradzić? Jedną opcją byłoby zapisanie tablicy w więcej niż jednym wywołaniu zapisu, tak aby rozmiar rekordu w każdym zapisie był mniejszy niż 2,5 GB. Ale zastanawiam się, czy mogę napisać całą tablicę w jednym wywołaniu.

Edit: u została zadeklarowana jako double precision u(5,0:408,0:408,0:407) Program został skompilowany jako gfortran -O3 -fopenmp -mcmodel=medium test.f Jest jakiś kod OpenMP w tym programie, ale plik I/O jest sekwencyjna.

gfortran v 4.5.0, OS: openSUSE 11.3 na 64 bitowych AMD Opteron

Dzięki za pomoc.

Odpowiedz

16

Powinieneś być w stanie pisać duże tablice, o ile pozwala na to pamięć. Wygląda na to, że otrzymujesz przepełnienie całkowite za pomocą funkcji sizeof. sizeof nie jest standardem Fortran i nie polecałbym go używać (implementacje mogą się różnić w zależności od kompilatorów). Zamiast tego lepiej jest użyć instrukcji inquire, aby uzyskać długość rekordu. Byłem w stanie odtworzyć twój problem z ifortem i to rozwiązanie działa dla mnie. Można uniknąć przepełnienia całkowitą deklarując wyższą zmienną typu:

integer(kind=8) :: reclen 

inquire(iolength=reclen)u 

open(unit=20,file='output.txt',form='unformatted',& 
    access='direct',recl=reclen) 

EDIT: Po pewnym dochodzenia, to wydaje się być gfortran problem. Ustawienie wyższego rodzaju dla liczby całkowitej reclen rozwiązuje problem dla ifort i pgf90, ale nie dla gfortran - właśnie wypróbowałem to w wersji 4.6.2. Mimo że reclen ma poprawną wartość dodatnią, wydaje się, że recl jest 32-bitową liczbą całkowitą ze znakiem wewnętrznym z gfortran (Thanks @ M.S.B. Za wskazanie tego). Błąd wykonania w Fortranie sugeruje to, a nie, że wartość jest większa niż maksymalna. Wątpię, żeby to był problem z OS. Jeśli to możliwe, spróbuj użyć ifort (darmowy do użytku niekomercyjnego): Intel Non-Commercial Software Download.

+5

wystarczy dodać: 'sizeof' zwraca liczbę bajtów, a' recl' niekoniecznie w bajtach, więc 'inquire' to właściwy sposób na zrobienie tego. – steabert

+0

@steabert Dzięki za dodanie, jest to poprawne. Przykładem tego jest kod z OP, który zepsułby się na przykład ifort - ifort zakłada, że ​​recl jest długością tablicy, jak w liczbie elementów, a nie liczbą bajtów. – milancurcic

+0

Nadal dostaję ten sam błąd. Wygląda na to, ponieważ maksymalna wartość 'recl' wynosi 2147483648 (2 GB). – jitihsk

Powiązane problemy