* THE BILLION ROW CHALLENGE OPEN 'MEASUREMENTS' TO FV.MEASUREMENTS ELSE STOP 201,'MEASUREMENTS' CLEARFILE FV.MEASUREMENTS START = TIME() * START OFF CREATING A DIMENTIONED ARRAY OF MEASUREMENTS WITH ENOUGH SPACE TO HOLD 1000 WEATHER STATIONS DIM MEASUREMENTS(1000, 4) ;* STORE COUNT, MIN, MAX AND TOTAL FOR EACH STATION MAT MEASUREMENTS = 0 STATIONS = '' ;* This is a sorted list of the station names STATION.INDEXES = '' ;* this holds the station's row in the MEASUREMENTS array. STATION.COUNT = 0 * I don't want to create a huge file so I'm just going to simulate 1,000,000 rows by processing * the 413 row measurements.txt4 file 2430 times. FOR X = 1 TO 2413 GOSUB PROCESS.MEASUREMENTS NEXT PRINT TIME() - START *GOSUB PRINT.MEASUREMENTS STOP PROCESS.MEASUREMENTS: EXECUTE 'QSELECT BARS.UTL.BP measurements.txt' CAPTURING OUTPUT LOOP READNEXT LINE ELSE EXIT STATION = FIELD(LINE,';', 1) TEMPERATURE = FIELD(LINE,';',2) * Find the station position by looking it up in the STATIONS variable READ POSITION FROM FV.MEASUREMENTS, STATION ELSE STATION.COUNT += 1 POSITION = STATION.COUNT WRITE POSITION ON FV.MEASUREMENTS, STATION MEASUREMENTS(POSITION, 2) = 9999 ;* THIS IS THE MIN TEMP. MAKE SURE IT STARTS OFF BIG. END MEASUREMENTS(POSITION, 1) += 1 ;* COUNT OF STATIONS MEASUREMENTS(POSITION, 4) += TEMPERATURE ;* TOTAL OF TEMPERATURES IF TEMPERATURE < MEASUREMENTS(POSITION, 2) THEN MEASUREMENTS(POSITION, 2) = TEMPERATURE END IF TEMPERATURE > MEASUREMENTS(POSITION, 3) THEN MEASUREMENTS(POSITION, 3) = TEMPERATURE END REPEAT RETURN PRINT.MEASUREMENTS: EXECUTE 'SSELECT MEASUREMENTS' CAPTURING OUTPUT LOOP READNEXT STATION ELSE EXIT READ STATION.INDEX FROM FV.MEASUREMENTS, STATION THEN PRINT STATION 'L#10 ': PRINT MEASUREMENTS(STATION.INDEX, 1) 'R#5 ': PRINT MEASUREMENTS(STATION.INDEX,2) 'R1#7 ': PRINT (MEASUREMENTS(STATION.INDEX,4) / MEASUREMENTS(STATION.INDEX, 1)) 'R6,#12 ': PRINT MEASUREMENTS(STATION.INDEX, 3) 'R1#7' END REPEAT RETURN