我有一个文件,该文件是119列(用空格分隔)和约50000行(行)的表。我想删除重复的条目,即那些具有所有相同列的行(119)。我草绘了这段代码:
PROGRAM deldup
IMPLICIT NONE
DOUBLE PRECISION PAR(119),PAR2(119)
INTEGER I,J,K,LINE,TREP
CHARACTER filename*40
c Get the input file name
CALL getarg(1,filename)
c File where the results will be stored.
OPEN(29, FILE="result.dat", STATUS='UNKNOWN')
c Current line number
LINE=0
c counting repeated points
TREP=0
101 LINE=LINE+1
OPEN(27, FILE=filename, STATUS='OLD')
c Verifying that we are not in the first line... and we read the
c corresponding one
IF (LINE.NE.1) THEN
DO K=1,LINE-1
READ(27,11,ERR=103,END=9999)
END DO
ENDIF
READ(27,11,ERR=103,END=9999) (PAR(I),I=1,119)
c Start comparing line by line looking for matches. If a match is
c found , close the
c file and open it again to read the next line. If the end of file is
c reached and not iqual rows found, write the line in "results.dat"
102 READ(27, 11,END=104, ERR=102) (PAR2(I),I=1,119)
DO J=1,119
IF ( PAR(J).NE.PAR2(J) ) THEN
GOTO 102
ELSEIF (J.EQ.119) THEN
TREP=TREP+1
GOTO 103
ENDIF
END DO
104 WRITE(29,11) (PAR(I),I=1,119)
103 CLOSE(27)
GOTO 101
9999 WRITE(*,*) "DONE!,", TREP, "duplicated points found!"
CLOSE(27)
CLOSE(28)
CLOSE(29)
11 FORMAT(200E14.6)
END
实际上有效,这只是超级慢。为什么?我可以使用任何图书馆吗?对不起,很抱歉,我对Fortran77完全陌生。
对于每一行,您打开和关闭原始文件的速度非常慢!为了加快速度,您可以使用rewind
。
但是,主要问题是算法的复杂性:O(n^2)
[将每一行与其他每一行进行比较]。首先,我将保留一个唯一行的列表,然后与该列表进行比较。如果已经列出了新行,则将其丢弃-如果没有,则为新的唯一行。这样O(n*m)
(希望)将复杂度降低为,m << n
(m是唯一行的数量)。对行进行排序可能会加快比较速度。
下一个注意事项是从I / O转移到内存!将完整文件读入数组,或者至少将唯一行列表保留在内存中。一个50,000x119的双精度数组需要约45MB的RAM,所以我认为这应该是可行的;-)在最后一步中将结果写回。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句