Быстро прочитать кучу файлов

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
MOV
Постоялец
Постоялец
 
Сообщения: 414
Зарегистрирован: 13.03.2004 (Сб) 15:13
Откуда: Санкт-Петербург

Быстро прочитать кучу файлов

Сообщение MOV » 11.04.2005 (Пн) 11:55

Есть директория где все время лежит порядка пары тысяч текстовых файлов.
Периодически надо их распечатывать, но не все, а только те в которых третья строка ссответствует определенному критерию, например, равна "78045962321".
Делаю так: беру два файллиста в одном файлы, которые надо проверить открываю каждый файл через open читаю три строки readline-ом, сравниваю значение строки, закрываю файл, и так далее, те файлы, в которых строка совпадает с нужным значением копирую в другую директорию, а потом все, что скопировалось в эту директорию печатаю, потом все файлы из нее удаляю. Понятно, что при таком подходе самая долгая процедура - это чтение всех файлов. Можно, наверно, это ускорить, создав отдельный текстовик, где были бы записаны нужные значения из всех файлов, можно было прошарить только один этот файл и все, то есть типа индексного файла, но может можно как-то иначе ускорить это дело?

xolod
Гуру
Гуру
 
Сообщения: 1162
Зарегистрирован: 15.01.2004 (Чт) 0:42
Откуда: Moscow

Сообщение xolod » 11.04.2005 (Пн) 12:01

Как можно ускорить процесс чтения нескольких тысяч файлов?
Ну, например, массивом SCSI дисков заменить вашу дисковую систему.
Никак не ускоришь. Подход в корне надо менять.
Откуда вообще эти файлы приходять? Кто им меняет третью строку?

Constant ERROR_SUCCESS deprecated. I'm so happy.
Программирование и дизайн – http://www.macrointellect.ru

MOV
Постоялец
Постоялец
 
Сообщения: 414
Зарегистрирован: 13.03.2004 (Сб) 15:13
Откуда: Санкт-Петербург

Сообщение MOV » 11.04.2005 (Пн) 12:09

Я имел в виду, что может есть возможность какого-нибудь кэширования, ну чтобы ускорить сам процесс. Это обычные текстовики размером максимум 9КБ и нужна в них только третья строка (там записана дата создания этого текста, но не файла, а именно текста, поэтому без чтения файла не обойтись можно было бы еще например при создании этих файлов присваивать им имя с датой, которая внутри, но это уже не получится, хотя было бы очень удобно и думаю, что быстрее). Хотя можно так и сделать, но интересно узнать есть ли другие способы.

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 11.04.2005 (Пн) 12:24

Н-да... Пипец, сорри за терминологию.

Любой файл, хошь Аксессовская БД, хошь текстовик, кладется отдельно (либо выше уровнем, либо уникальное имя файла под него резервируешь в своей кучемале). При изменении любого другого ("обычного") файла одновременно делается запись в этот отдельный файл. В одну строку пишешь все что надо.
Потом, печатаюший процесс не парсит все файлы подряд (проще говоря, не занимается такой фигней, как Table Scan), а лезет в этот отдельный файл и оттуда берет полный список того, что ему надо печатать (Index Seek). После успешной обработки файла он удаляет соотв. ему строку из этого файла. Вот тебе и все "кэширование".

На всякий случай: в теории БД это называется "индекс".

MOV
Постоялец
Постоялец
 
Сообщения: 414
Зарегистрирован: 13.03.2004 (Сб) 15:13
Откуда: Санкт-Петербург

Сообщение MOV » 11.04.2005 (Пн) 12:36

Ennor, да иногда могу певергнуть в шок своей извращенностью :D
Про индекс уменя была мысль (см. самое первое сообщение). Но по моему проще (в смысле переписки проги) и оптимальнее закатывать эту строку в имя файла, тогда их не надо будет открывать, а просто можно сразу смотреть на имя и все. Тем более, что эта же прога и создает эти файлы.

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 11.04.2005 (Пн) 12:46

Нет, не оптимальнее. На больших каталогах перебор файлов начинает тормозить. Поверь мне, Index Seek - великая вещь. :)

Ну а учитывая, что это все одна и та же программа, появляется другой вопрос - а нахрена тебе вообще дисковый поиск/индекс? Сделай глобальную коллекцию в памяти и юзай ее, быстрее уже некуда будет.

MOV
Постоялец
Постоялец
 
Сообщения: 414
Зарегистрирован: 13.03.2004 (Сб) 15:13
Откуда: Санкт-Петербург

Сообщение MOV » 11.04.2005 (Пн) 13:06

Ennor
Сделай глобальную коллекцию

О! Это для меня что-то новое. А можно подробнее немного.

Сделай глобальную коллекцию

Из чего и как ее сделать?

А пока сделал все-таки путем создания соответстующих иемн файлов скорость все равно увелисилась в десяток раз точно, а то и больше пока не мерил - явно лучше и так видно.

Sedge
Alternative Choice
Alternative Choice
Аватара пользователя
 
Сообщения: 1049
Зарегистрирован: 16.05.2002 (Чт) 18:23
Откуда: Somewhere-In-The-Net

Сообщение Sedge » 11.04.2005 (Пн) 14:30

2 MOV Если ты сам, из свой программы пишешь эти текстовые файлы, то может быть стоит пересмотреть сам процесс хранения информации? Задействовать, к примеру, тот же Access. Вообще, с чем связана необходимость хранить инфу, размер которой максимум 9 кб, в отдельных мелких файлах?

MOV
Постоялец
Постоялец
 
Сообщения: 414
Зарегистрирован: 13.03.2004 (Сб) 15:13
Откуда: Санкт-Петербург

Сообщение MOV » 12.04.2005 (Вт) 8:38

Sedge, эти файлы по сути - электронные документы, которые мне надо иногда отправлять по почте (делаю этой же прогой). Access итак подвязан на это дело - пишу в него обобщенную инфу по этим файлам, в общем типа аудита. Завязывать работу с файлами на Access не охота, т.к. и базу и фалы надо периодически чистить, а если они будут сильно завязаны друг на друга... в общем не охота :?

Пока сделал так:
Изменил вормат имени файла такой:

PD1104050004527m.txt

где после PD идет 6 цифр - дата, которая прописана внутри файла
выбираю так:

Код: Выделить всё
Dim  i As Integer
Dim Name As String*6
Dim Dt As String * 8
For i = 0 To File1.ListCount - 1
    Name = Right(Left(File1.List(i), 8), 6)
    Dt = Left(Name, 2) & "." & Right(Left(Name, 4), 2) & "." & Right(Name, 2)
        If Dt = CStr(Format((Date - 1), "dd/MM/yy")) Then
            If UCase(Left(Right(File1.List(i), 5), 1)) = "M" Then PrnOne i ' PrnOne - процедура печати файла
        End If
Next


А как можно это ускорить? Может есть вариант скопировать быстро весь список файллиста в массив каким-нибудь CopyMemory и работать уже с ним или этот список по своей сути итак уже массив? :?

Еще попробую SendMessage совестно с
Const LB_FINDSTRING = &H18F
Хотя это находит первую подходящую строку, а дальше как? (ведь необязательно, что найдя первый нужный файл в листбоксе, можно от него искать дальше вниз, как бы вот найти сразу все нужные файлы :D )
Последний раз редактировалось MOV 12.04.2005 (Вт) 9:30, всего редактировалось 1 раз.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 12.04.2005 (Вт) 9:20

Нечто типа этого:

Код: Выделить всё
s = Dir$("PD" & Format$(Date-1,"ddmmyy") & "*m.txt")
Do While Len(s)
    ' Печатаем файл s
    s = Dir$
Loop
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

MOV
Постоялец
Постоялец
 
Сообщения: 414
Зарегистрирован: 13.03.2004 (Сб) 15:13
Откуда: Санкт-Петербург

Сообщение MOV » 12.04.2005 (Вт) 9:40

Andrey Fedorov
Круто. (В смысле краткость - сестра таланта.) Не знал что звездочка в VB работатет как и в SQL пойду пробовать. А вообще, красиво, не то, что мои if зены блин.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 12.04.2005 (Вт) 9:44

MOV писал(а):Не знал что звездочка в VB работатет как и в SQL пойду пробовать.


Dir supports the use of multiple character (*) and single character (?) wildcards to specify multiple files.
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

MOV
Постоялец
Постоялец
 
Сообщения: 414
Зарегистрирован: 13.03.2004 (Сб) 15:13
Откуда: Санкт-Петербург

Сообщение MOV » 12.04.2005 (Вт) 9:58

Да. Я понял. Это оно. Полезный прием. На этом и остановлюсь. Спасибо.
Только еще один вопрос. Таким образом

Код: Выделить всё
Name = Dir$(File1.Path & "\PD" & Format$(Date - 1, "ddmmyy") & "*m.txt")


Name присваивается значение первого найденного соответствующего файла, то есть надо все-таки перебирать выходит весь файллист. Но все равно код так лучше смотрится.

kif
Постоялец
Постоялец
 
Сообщения: 736
Зарегистрирован: 10.12.2001 (Пн) 18:06
Откуда: Украина, Одесса

Сообщение kif » 12.04.2005 (Вт) 16:17

поставь вместо расширения .txt свою дату==.01/01/2005
тогда не придется открывать лишние файлы

винда к этому нормально отнесется :D
Братья и сестры, что вы делаете???
Ведь вы же братья и сестры.

kif
Постоялец
Постоялец
 
Сообщения: 736
Зарегистрирован: 10.12.2001 (Пн) 18:06
Откуда: Украина, Одесса

Сообщение kif » 12.04.2005 (Вт) 16:18

поправка дата == 20050101 :D
Братья и сестры, что вы делаете???
Ведь вы же братья и сестры.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 12.04.2005 (Вт) 16:31

MOV писал(а):Да. Я понял. Это оно. Полезный прием. На этом и остановлюсь. Спасибо.
Только еще один вопрос. Таким образом

Код: Выделить всё
Name = Dir$(File1.Path & "\PD" & Format$(Date - 1, "ddmmyy") & "*m.txt")


Name присваивается значение первого найденного соответствующего файла, то есть надо все-таки перебирать выходит весь файллист. Но все равно код так лучше смотрится.


Почему весь? Ты получишь только файлы соответствующие твоей маске - тебе ведь этого и хотелось...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

MOV
Постоялец
Постоялец
 
Сообщения: 414
Зарегистрирован: 13.03.2004 (Сб) 15:13
Откуда: Санкт-Петербург

Сообщение MOV » 12.04.2005 (Вт) 16:45

kif, да, я так и сделал, но не расширение (так как на другой стороне требуют текстовики) а просто вписал в имя файла.
Andrey Fedorov , но не все же файлы сразу влезут в эту переменную s она ведь даже не массив, а только имя одного файла влазит, короче, я видимо что-то не понял все-таки. :?

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 12.04.2005 (Вт) 16:48

Зачем тебе все файлы в переменную?
Задаешь маску нужных тебе файлов и получаешь только их.
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

MOV
Постоялец
Постоялец
 
Сообщения: 414
Зарегистрирован: 13.03.2004 (Сб) 15:13
Откуда: Санкт-Петербург

Сообщение MOV » 12.04.2005 (Вт) 18:20

Задаешь маску нужных тебе файлов и получаешь только их.

Это я понимаю - по аналогии с любым файлмэнеджером (в фаре например клавиша "+" задаешь маску и твои фалы выделены). Здесь то же самое, только я говорю про то, что, видимо, придется перебирать все файлы в этой директории сравнивая с этой маской. Так? А как получить их все (то есть сразу весь список по маске, если это можно сделать одним махом, то в переменную какого типа он запишется)- туплю, не догоняю. :oops:

Cryonyx
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 292
Зарегистрирован: 12.11.2004 (Пт) 15:40
Откуда: Net_SubStream

Сообщение Cryonyx » 12.04.2005 (Вт) 21:29

Пожалуй, стоит добавить вот это:
Код: Выделить всё

Dim C as New Collection
s = Dir$("PD" & Format$(Date-1,"ddmmyy") & "*m.txt")
Do While Len(s)
    c.Add s
    ' Печатаем файл s
    s = Dir$
Loop


Тогда у тя все имена фалов буду сохранены в коллекции по индексам от 1 и до пределов фантазии и рам-памяти :D
Если тебе не по сердцу мой путь,
Выбери сам или выбери с кем,
А мне по барабану вся эта муть -
Я не червонец, чтобы нравиться всем!
© К.Кинчев
--
Мой блог: щёлкай сюда

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 13.04.2005 (Ср) 7:14

MOV писал(а):
Задаешь маску нужных тебе файлов и получаешь только их.

Это я понимаю - по аналогии с любым файлмэнеджером (в фаре например клавиша "+" задаешь маску и твои фалы выделены). Здесь то же самое, только я говорю про то, что, видимо, придется перебирать все файлы в этой директории сравнивая с этой маской. Так? А как получить их все (то есть сразу весь список по маске, если это можно сделать одним махом, то в переменную какого типа он запишется)- туплю, не догоняю. :oops:


Ну запиши их в коллекцию, как выше сказали. Хотя зачем они тебе все сразу - все одно обрабатывать будешь поочереди...

Кстати, можно ведь их просто в соответствующие папки распихивать и потом для обработки выбирать нужную папку...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Inferno
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 179
Зарегистрирован: 26.01.2005 (Ср) 1:06

Сообщение Inferno » 13.04.2005 (Ср) 12:28

Если ты сам создаешь файлы, то что тебе мешает создать файлы шаблонов. То есть, создаешь отдельный файл и пишешь в него данные которые удовлетворяют критерию. Потом целенаправленно открываешь файл шаблона и дергаешь файлы которые там прописаны.

kif
Постоялец
Постоялец
 
Сообщения: 736
Зарегистрирован: 10.12.2001 (Пн) 18:06
Откуда: Украина, Одесса

Сообщение kif » 13.04.2005 (Ср) 17:03

так кинь на форму file1
дай ему путь (Path)
и маску (Pattern)
refresh и все

у меня из 2500 файлов по маске быберает в пол секунды. :D

чего мучаться :?
Братья и сестры, что вы делаете???
Ведь вы же братья и сестры.

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 13.04.2005 (Ср) 18:12

Andrey Fedorov писал(а):Кстати, можно ведь их просто в соответствующие папки распихивать и потом для обработки выбирать нужную папку...
А так разве не лучше, чем присваивать дату к имени? В директории с нужной датой будут лежать все твои текстовики, и тебе не нужно перебирать остальные :wink:


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: SemrushBot и гости: 53

    TopList  
cron