@@ -153,7 +153,8 @@ procedure TGenerator.Generate;
153
153
outputBufWriter: TWriteBufStream;
154
154
line, randomTempFinal: String;
155
155
stationArray, temperatureArray: TStringArray;
156
- i, stationsCount, temperaturesCount: Integer;
156
+ LenStationArray, LenTemperatureArray: Array of Integer;
157
+ i, count, len, stationsCount, temperaturesCount: Integer;
157
158
start: TDateTime;
158
159
begin
159
160
// Randomize sets this variable depending on the current time
@@ -171,12 +172,18 @@ procedure TGenerator.Generate;
171
172
// based on code @domasz from lazarus forum, github: PascalVault
172
173
stationsCount := FStationNames.Count;
173
174
SetLength(stationArray, stationsCount);
175
+ SetLength(LenStationArray, stationsCount);
174
176
for i := 0 to stationsCount - 1 do
175
- stationArray[i] := FStationNames[i];
177
+ begin
178
+ stationArray[i] := FStationNames[i] + ' ;' ;
179
+ LenStationArray[i] := Length(stationArray[i]);
180
+ end ;
176
181
177
182
temperaturesCount := 1999 ;
178
183
SetLength(temperatureArray, temperaturesCount);
179
- temperatureArray[0 ] := ' 0.0' ;
184
+ SetLength(LenTemperatureArray, temperaturesCount);
185
+ temperatureArray[0 ] := ' 0.0' + #13 #10 ;
186
+ LenTemperatureArray[0 ] := Length(temperatureArray[0 ]);
180
187
for i := 1 to 999 do
181
188
begin
182
189
randomTempStr := IntToStr(i);
@@ -186,12 +193,16 @@ procedure TGenerator.Generate;
186
193
3 : randomTempFinal := randomTempStr[1 ] + randomTempStr[2 ] + ' .' + randomTempStr[3 ];
187
194
4 : randomTempFinal := randomTempStr[1 ] + randomTempStr[2 ] + randomTempStr[3 ] + ' .' + randomTempStr[4 ];
188
195
end ;
189
- temperatureArray[i * 2 - 1 ] := randomTempFinal;
190
- temperatureArray[i * 2 ] := ' -' + randomTempFinal;
196
+ temperatureArray[i * 2 - 1 ] := randomTempFinal + #13 #10 ;
197
+ LenTemperatureArray[i * 2 - 1 ] := Length(temperatureArray[i * 2 - 1 ]);
198
+ temperatureArray[i * 2 ] := ' -' + randomTempFinal + #13 #10 ;
199
+ LenTemperatureArray[i * 2 ] := LenTemperatureArray[i * 2 - 1 ] + 1 ;
191
200
end ;
192
201
//
193
202
194
- line := ' ' ;
203
+ count := 0 ;
204
+ len := 0 ;
205
+ SetLength(line, 1024 * 1024 * 20 );
195
206
196
207
try
197
208
// outputBufWriter:= TWriteBufStream.Create(outputFileStream, 4*1024);
@@ -205,12 +216,17 @@ procedure TGenerator.Generate;
205
216
// This is all paweld magic:
206
217
// From here
207
218
randomTemp:= Random(temperaturesCount);
208
- line := line + stationArray[stationId] + ' ;' + temperatureArray[randomTemp] + #13 #10 ;
209
- // Write(line);
210
- if index mod 10000 = 0 then
219
+ Move(stationArray[stationId][1 ], line[len + 1 ], LenStationArray[stationId]);
220
+ Inc(len, LenStationArray[stationId]);
221
+ Move(temperatureArray[randomTemp][1 ], line[len + 1 ], LenTemperatureArray[randomTemp]);
222
+ Inc(len, LenTemperatureArray[randomTemp]);
223
+
224
+ Inc(count);
225
+ if count = 10000 then
211
226
begin
212
- outputBufWriter.WriteBuffer(line[1 ], Length(line));
213
- line := ' ' ;
227
+ outputBufWriter.WriteBuffer(line[1 ], len);
228
+ count := 0 ;
229
+ len := 0 ;
214
230
end ;
215
231
// To here
216
232
Dec(progressBatch);
@@ -226,9 +242,9 @@ procedure TGenerator.Generate;
226
242
progressBatch:= floor(FLineCount * (batchPercent / 100 ));
227
243
end ;
228
244
end ;
229
- if line <> ' ' then
245
+ if count > 0 then
230
246
begin
231
- outputBufWriter.WriteBuffer(line[1 ], Length(line) );
247
+ outputBufWriter.WriteBuffer(line[1 ], len );
232
248
end ;
233
249
finally
234
250
outputBufWriter.Free;
0 commit comments