Ужасная скорость открытия файла

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
xolod
Гуру
Гуру
 
Сообщения: 1162
Зарегистрирован: 15.01.2004 (Чт) 0:42
Откуда: Moscow

Ужасная скорость открытия файла

Сообщение xolod » 16.03.2005 (Ср) 22:20

Есть файл. Обычный текст. Размером около 10 мегабайт.
Открываю через Open - где-то 10-12 минут. Открываю через API CreateFile - уже лучше, но все-равно минут 5-6.
Запускаю UltraEdit 32 - открывает где-то 1-2 секунды :shock:.
Как это он так??

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

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 16.03.2005 (Ср) 22:23

может он только часть файла сначала загружает :?:

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 16.03.2005 (Ср) 22:28

Сколько открывает обоими способами любой другой 10-меговый файл? Что-то я сомневаюсь в 5-12 минутах :/
Вроде бы, 5-10 секунд - даже много для OpenFile :/

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

Сообщение xolod » 16.03.2005 (Ср) 22:44

Konst_One
Файл загружается полностью. Если бы он грузил в процессе, как это делает Microsoft CParser (Word, Excel, Wordpad) - я бы и вопросов не задавал

Amed
Сам пребываю в :shock:.. Но факт остается фактом. Другой файл не пробовал, да и смысл какой?

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

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 16.03.2005 (Ср) 22:46

Может, именно этот файл разбит на миллиард фрагментов, и бедная головка винта мечется от одного фрагмента к другому?

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

Сообщение xolod » 16.03.2005 (Ср) 23:22

Amed
Если бы было так, то головка металась бы и в случая открытия в UltraEdit, или нет?
Все-таки попробавал другой файл, тоже примерно такого же размера и содержания - результат фактически такой же.. :?

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

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 17.03.2005 (Чт) 2:32

Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

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

Сообщение xolod » 17.03.2005 (Чт) 3:39

2 GSerg
Открываю через Open - ...

Интересно, то что я написал, было замечено :)?

Боюсь что вопрос мой задан был не корректно. Открытие и через Open и через CreateFile - одинаково быстро. Тормоз идет в месте сброки строки из полученного байтового массива.
Во тут я уже бессилен.
Собирать строку методом VB
Код: Выделить всё

StringFull = StringFull & StringPart

вообще гиблое дело, слишком медленно...
Собирать с помощью CopyMemory быстрее конечно, но все-равно не так быстро, как бы мне хотелось. А хотелось бы, как у UltraEdit.

Есть еще мнения, товарищи? :roll:

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

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 17.03.2005 (Чт) 5:13

xolod писал(а):Интересно, то что я написал, было замечено :)?

А ты как думал :)
Просто Open - понятие растяжимое, там режимы разные есть :)

xolod писал(а):
Код: Выделить всё
StringFull = StringFull & StringPart

вообще гиблое дело, слишком медленно...

А почему ты её так собираешь? Сразу нельзя всё прочитать?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

sashar2
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 170
Зарегистрирован: 06.02.2005 (Вс) 19:58

Сообщение sashar2 » 17.03.2005 (Чт) 7:17

Вот у меня быстро файл прочитать удается, не знаю в чем проблема:

Private Sub Form_Load()
Dim data As Byte
Open "c:\1.exei" For Binary As #1
Get #1, , data
Close #1
End Sub

А вот записать уже не удается, потому что выводится файл с виду похожий, но запускаться отказывается. Что мне делать?

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

Сообщение xolod » 17.03.2005 (Чт) 7:45

2 GSerg
Чтобы было понятней, объясню. Задача такая. Надо открыть большой файл с индексом (информацией для поиска) - 10 мегабайт, самый маленький из них. Так вот, надо его открыть, показать пользователю в удобоваримом виде (например сделать в виде категорий в treeview) и по нему поиск организовать.
1. Если читать for binary, то получаем циферки в байтовом массиве, чтобы получить буковки - нужен цикл и сборка (ответ на твой вопрос, поправь если есть способ лучше)
2. Если читать for input -> line input ИЛИ input, то тормоз архивеликий.
3. Если читать CreateFile, то см. пункт 1


говорит про себя, с сожалением, но любя
какой же VB тормоз...


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

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

Сообщение xolod » 17.03.2005 (Чт) 7:53

2 sashar2
В переменной типа byte могу быть только значения от 0 до 255
Непонятно, как твой код у тебя вообще работает.

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

FaKk2
El rebelde gurú
El rebelde gurú
Аватара пользователя
 
Сообщения: 2031
Зарегистрирован: 09.03.2003 (Вс) 22:10
Откуда: Los Angeles

Сообщение FaKk2 » 17.03.2005 (Чт) 8:04

xolod
Так он один байт и читает :)
Для получения ответа надо продемонстрировать качества, позволяющие стать компетентным — внимательность, вдумчивость, наблюдательность, желание активно участвовать в выработке решения.

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

Сообщение xolod » 17.03.2005 (Чт) 8:13

2 FAKK2
но ведь
sashar2 писал(а):... выводится файл с виду похожий, но ...

что и удивительно. Или у него exe'шник из одного байта :)

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

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

Сообщение xolod » 17.03.2005 (Чт) 8:22

2 GSerg
Вопрос отпал. VB - не тормоз. Тормоз - я. Причем ручной.
Можно ведь получить полностью строку путем get #filenumber, , string. Предварительно забив эту строку чем-либо по размеру как файл. Проверил - скорость такая, как я и предполагал в самом начале.

Thanks to all!
Case closed.

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

FaKk2
El rebelde gurú
El rebelde gurú
Аватара пользователя
 
Сообщения: 2031
Зарегистрирован: 09.03.2003 (Вс) 22:10
Откуда: Los Angeles

Сообщение FaKk2 » 17.03.2005 (Чт) 8:41

xolod
1-2 секунды?
Для получения ответа надо продемонстрировать качества, позволяющие стать компетентным — внимательность, вдумчивость, наблюдательность, желание активно участвовать в выработке решения.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 17.03.2005 (Чт) 9:24

Отводить буфер, а потом его забивать - эт, конечно, хорошо...
И такой вариант зацени:

Код: Выделить всё
dim s as string
open "file" for input as #1
s=input$(lof(1),#1)
close #1
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

CodeName33
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 297
Зарегистрирован: 01.09.2004 (Ср) 13:25
Откуда: SPb

Сообщение CodeName33 » 17.03.2005 (Чт) 10:32

GSerg, а такой вариант глючит в binary-файлах. Раньше сам так юзал, пока не наткнулся на какой-то файл, в котором то ли символ какой-то хитрый встретился, то ли определённая комбинация сомволов, но функция input$ не считывала всесь файл, а вот через open for binary, get в массив и копирование в строку нормально работало.
Программисты не глючат - глючат компиляторы...

FaKk2
El rebelde gurú
El rebelde gurú
Аватара пользователя
 
Сообщения: 2031
Зарегистрирован: 09.03.2003 (Вс) 22:10
Откуда: Los Angeles

Сообщение FaKk2 » 17.03.2005 (Чт) 10:39

Ctrl-Z наверно :roll:
Для получения ответа надо продемонстрировать качества, позволяющие стать компетентным — внимательность, вдумчивость, наблюдательность, желание активно участвовать в выработке решения.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 17.03.2005 (Чт) 10:46

Читаем условие. По условию это обычный текст :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Сообщение Ruslan Demidow » 17.03.2005 (Чт) 14:53

GSerg
А reg-файл является обычным текстом?
А то предложенный тобой вариант не читает полнотью reg-файл. А вернее читатет только первые два-три символа.
Это Ж-ж-ж-ж неспроста (с) Винни-Пух

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 17.03.2005 (Чт) 15:29

Если файл открыт как INPUT, то функция LOF возвращает длину файла не в байтах, а в блоках. Для получения длины файла ее следует умножить на 128.

[EDIT] Хотя нет, это я с Loc путаю.
Lasciate ogni speranza, voi ch'entrate.

sashar2
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 170
Зарегистрирован: 06.02.2005 (Вс) 19:58

Сообщение sashar2 » 17.03.2005 (Чт) 16:50

xolod
Извиняюсь, так не Byte, а String, короче вот:
Private Sub Form_Load()
Dim data As String
Open "c:\1.exe" For Binary As #1
Open "c:\2.exe" For Binary As #2
data = Input(FileLen("1.exe"), 1)
Put #2, 1, data
Close #1
Close #2
End
End Sub
Кажется так я писал... Таким способом создается совершенно нормальный файл, но так очень долго... А мне FileCopy не подойдет.
Просто у меня выходит так, что файл копируется со скоростью около 600 кб в сек, а так далеко не убежишь... Момогите пожалуйста :roll:

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

Сообщение xolod » 17.03.2005 (Чт) 23:09

2 FAKK2
Нет, конечно до UltraEdit не дотягивает, но вполне приемлимо. Секунды 2-3 на 10МБ файл.

2 GSerg
Вот она, рука опыта :). Способо еще лаконичней, чем мой :)

2 sashar2
Открываешь как binary, используешь input и filelen.. Странный ты :).

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

sashar2
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 170
Зарегистрирован: 06.02.2005 (Вс) 19:58

Сообщение sashar2 » 17.03.2005 (Чт) 23:13

xolod
Я не странный, просто я не опытный и мало еще чего знаю :(.
Вот таким способом скорость такая же как и при обычном копировании, а на старых машинах даже выше...:
Private Sub Form_Load()
Dim data As String
Open "c:\1.exe" For Binary As #1
Open "c:\2.exe" For Binary As #2
data = String$(LOF(1), 0)
Get #1, , data
Put #2, , data
Close #1
Close #2
End
End Sub

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 18.03.2005 (Пт) 5:33

Угу, только потеряются все атрибуты файла и дескриптор безопасности :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

sashar2
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 170
Зарегистрирован: 06.02.2005 (Вс) 19:58

Сообщение sashar2 » 18.03.2005 (Пт) 15:35

GSerg
:( Ну а как сделать быстро и качественно? Или хотя бы просто с обычной скоростью, но нормально?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 18.03.2005 (Пт) 15:40

Быстро и качественно, с сохранением всего - ну, например, SHFileOperation :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

sashar2
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 170
Зарегистрирован: 06.02.2005 (Вс) 19:58

Сообщение sashar2 » 18.03.2005 (Пт) 15:48

А можно пример?

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

Сообщение MOV » 22.03.2005 (Вт) 12:40

Код: Выделить всё
Private Declare Function lopen Lib "kernel32" Alias "_lopen" _
    (ByVal lpPathName As String, ByVal iReadWrite As Long) As Long
   
Private Declare Function lclose Lib "kernel32" Alias "_lclose" (ByVal hFile As Long) As Long

Private Declare Function lread Lib "kernel32" Alias "_lread" _
    (ByVal hFile As Long, lpBuffer As Any, ByVal wBytes As Long) As Long
   
Private Declare Function GetFileSize Lib "kernel32" _
    (ByVal hFile As Long, lpFileSizeHigh As Long) As Long

Private Sub Form_Load()
    Dim Fn As Long
    Dim Size as Long
    Dim Lbuf() as Byte

    Fn = lopen("C:\MyFile.txt", 2)
    Size = GetFileSize(Fn, 0)
    ReDim LBuf(Size - 1)
    lread Fn, LBuf(0), Size
    lclose Fn

End Sub


Само открытие и считываение идет быстро и способов много, а вот если заполнять контрол какой-нибудь из полученного массива типа MSHFlexGrid (ведь файл -таблица, как понял), то это да, это будет долго (даже через CopyMemory) и скорее всего дело именно в этом, в медленном заполнении контрола.

След.

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

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

Сейчас этот форум просматривают: Yandex-бот и гости: 133

    TopList