:: Visual Foxpro, Foxpro for DOS
Идея быстрой раскодировки файла
boba

Сообщений: 6269
Откуда: Медвежьи озера-
Дата регистрации: 26.03.2001
Есть текстовый файл приличных размеров, который для обработки
пытаюсь декодировать в курсор
Ниже его фрагмент
Шапка времени повторяется каждые полчаса.
Размер файла 1 год.
Сначала написал такую программу
Close Tables All
Set Date To ymd
Set Century On
Set Decimals To 10
fln = Getfile('*')
Set Escape On
jkl = 0
If Not Empty(fln)
Create Cursor curres (dtt T, freq N(14,10), ampl N(17,10))
strr = Filetostr(fln)
For jj = 1 To Getwordcount(strr, Chr(13))
lcwrd = Chrtran(Getwordnum(strr,jj, Chr(13)),Chr(10),'')
If 'start'$lcwrd
jkl = jkl +1
lctm = Ctot(Substr(lcwrd,8,10)+' '+Substr(lcwrd,19,10))
If jkl = 1
oldlctm =lctm
Endif
Endif
If Isdigit(lcwrd) And Not Empty(lctm)
lcfreq = Val(Getwordnum(lcwrd, 1, ','))
lcampl = Val(Getwordnum(lcwrd, 2, ','))
Insert Into curres Values (lctm, lcfreq, lcampl)
If Mod(jkl, 100) = 0 AND oldlctm !=lctm
?lctm
oldlctm =lctm
Endif
Endif
Endfor
Endif
За 9 часов программа прочитала только по середину мая.
Пробовал открыть файл сначала в ексел, а потом обработать фоксом.
Прочиталась только часть с предложение разбить файл на куски, да еще и неверно прочитался штамп времени.
Идеи, ка прочитать файл побыстрее?

start: 2018-01-01T00:00:00
end: 2018-01-01T01:00:00
# freq, power
0.0052556, -174.57586340502195
0.00573128, -174.45340799630088
0.00625, -174.62475197337486
0.00681567, -174.45507080934868
0.00743254, -174.5022208591745
0.00810525, -174.51012138731426
0.00883883, -174.64444667436527
0.00963882, -174.48909564292603
0.0105112, -174.65861740204647
0.0114626, -174.2354124743234
0.0125, -174.30681820946552
0.0136313, -173.92763380483257
0.0148651, -173.9639315139006
0.0162105, -173.541604007155
0.0176777, -173.72991109295486
0.0192776, -173.9579002757477
0.0210224, -173.87441085857427
0.0229251, -174.08462100108363
0.025, -173.95862073542267
0.0272627, -174.11107847193614
0.0297302, -174.458301552552
Ratings: 0 negative/0 positive
Re: Идея быстрой раскодировки файла
akvvohinc
Автор

Сообщений: 4219
Откуда: Москва
Дата регистрации: 11.11.2008
boba
Идеи, как прочитать файл побыстрее?

В первую очередь не загонять весь текстовый файл в строку - все эти функции работы со словами в огромной строке и есть главный тормоз, а прочитать миллион записей из текстового файла обычным FGETS() дело 2-3 секунд.

Ну и мелочь:
lctm = Ctot(Substr(lcwrd,8,10)+' '+Substr(lcwrd,19,10))
Букву T убирать не требуется.



Исправлено 1 раз(а). Последнее : akvvohinc, 30.10.19 20:21
Ratings: 0 negative/0 positive
Re: Идея быстрой раскодировки файла
vk65

Сообщений: 402
Дата регистрации: 08.04.2008
Вместо filetostr/getwordnum... использовать fopen/fgets...
Ratings: 0 negative/0 positive
Re: Идея быстрой раскодировки файла
ssa

Сообщений: 13007
Откуда: Москва
Дата регистрации: 23.03.2005
Close Tables All
Set Date To ymd
Set Century On
Set Decimals To 10
fln = Getfile('*')
Set Escape On
jkl = 0
If Not Empty(fln)
lnFileIn = Fopen(fln)
Create Cursor curres (dtt T, freq N(14,10), ampl N(17,10))
Do While Not Feof(lnFileIn)
strr = Alltrim(Fgets(lnFileIn)) && ssa Filetostr(fln)
*ssa* For jj = 1 To Getwordcount(strr, Chr(13))
*ssa* lcwrd = Chrtran(Getwordnum(strr,jj, Chr(13)),Chr(10),'')
If 'start' $ strr && ssa lcwrd
jkl = jkl +1
lctm = Ctot(Substr(strr,8))
If jkl = 1
oldlctm =lctm
Endif
Endif
If Isdigit(strr) And Not Empty(lctm)
lcfreq = Val(Getwordnum(strr, 1, ','))
lcampl = Val(Getwordnum(strr, 2, ','))
Insert Into curres Values (lctm, lcfreq, lcampl)
If Mod(jkl, 100) = 0 And oldlctm !=lctm
?lctm
oldlctm =lctm
Endif
Endif
EndDo
Fclose(lnFileIn)
*ssa* Endfor
Endif
В закоментированных строках убран главный тормоз.


------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: Идея быстрой раскодировки файла
akvvohinc
Автор

Сообщений: 4219
Откуда: Москва
Дата регистрации: 11.11.2008
Еще:

oldlctm =lctm
Запоминать предыдущее значение даты достаточно в том месте, где она меняется.
Я бы делал это примерно так:

oldlctm = {}
f_changetime = .F.
DO WHILE !FEOF(fh)
lcwrd = FGETS(...)
IF 'start'$lcwrd
lctm = ...
f_changetime = oldlctm!=lctm
oldlctm = lctm
LOOP
ENDIF
...
ENDDO

А ниже, где это требуется, использовать f_changetime и не выполнять бесполезные присвоения oldlctm.



Исправлено 1 раз(а). Последнее : akvvohinc, 30.10.19 20:57
Ratings: 0 negative/0 positive
Re: Идея быстрой раскодировки файла
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Можно ещё через APPEND FROM загнать в промежуточный курсор (банально 1 символьное поле на 100-200 символов, сколько там по логике максимально в строке возможно), и там уже перемещаясь по записям разбирать данные. В одной мега-строке со всем содержимым файла 100% не следует колупаться.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Идея быстрой раскодировки файла
boba

Сообщений: 6269
Откуда: Медвежьи озера-
Дата регистрации: 26.03.2001
Сергей, спасибо за правку программы.
Пролетела в лет полтора миллиона записей.
Я почему-то думал, что чтение в памяти
должно работать быстро.
Ratings: 0 negative/0 positive
Re: Идея быстрой раскодировки файла
ssa

Сообщений: 13007
Откуда: Москва
Дата регистрации: 23.03.2005
boba
Я почему-то думал, что чтение в памяти
должно работать быстро.
А тут дело не в нём. В закоментированных строках убран подсчет количества строк файла в цикле. Условие цикла проверяется на каждой итерации.

------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: Идея быстрой раскодировки файла
vk65

Сообщений: 402
Дата регистрации: 08.04.2008
ssa
В закоментированных строках убран подсчет количества строк файла в цикле. Условие цикла проверяется на каждой итерации.
подсчет количества строк выполняется 1 раз.
for i = 1 to fu()
?i
endfor
function fu
?0
return 3
Ratings: 0 negative/0 positive
Re: Идея быстрой раскодировки файла
akvvohinc
Автор

Сообщений: 4219
Откуда: Москва
Дата регистрации: 11.11.2008
ssa
Условие цикла проверяется на каждой итерации.
Это противоречит руководству:
The values of nInitialValue, nFinalValue, and nIncrement are read only initially.

Тормоз - это GETWORDNUM() внутри цикла, да и бесполезные CHRTRAN() скорости не добавляют.



Исправлено 1 раз(а). Последнее : akvvohinc, 31.10.19 17:27
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 26 AndyNigmatec vech Guest (Гостей: 23)

© 2000-2024 Fox Club 
Яндекс.Метрика