|
Основной форум Сюда все проблемы связанные с программированием. |
09.03.2010, 14:21
|
#1
|
Оператор ЭВМ
Регистрация: 24.02.2010
Сообщений: 29
Написано одно полезное сообщение
|
большие тормоза при работе с FlashCard
на флэшке есть куча файлов (>5000). и при поиске файлов проходит 10 секунд до того как найдет. Карту попробую поменять, сформатировать. Разбить на подкаталоги не могу. есть предложения как ускорить процесс доступа к файлам?
средствами телефона по папке гуляю, но это не показатель. так как моя скорость нажатия на кнопки куда ниже чем поиск
|
(Offline)
|
|
09.03.2010, 15:03
|
#2
|
Злобный Админ
Регистрация: 04.09.2005
Сообщений: 5,926
Написано 3,415 полезных сообщений (для 9,330 пользователей)
|
Ответ: большие тормоза при работе с FlashCard
Флешкарты очень слабы в random-access доступе, однако форматирование карты в ntfs может решить эту проблему отчасти. Однако невсе устройства ntfs понимают.
__________________
|
(Offline)
|
|
09.03.2010, 16:38
|
#3
|
Мастер
Регистрация: 06.09.2007
Адрес: Донецк, ДНР
Сообщений: 1,023
Написано 298 полезных сообщений (для 713 пользователей)
|
Ответ: большие тормоза при работе с FlashCard
Лучше распихать всё по подпапкам (где-то по 100 файлов), хоть какой-то прирост производительности.
|
(Offline)
|
|
09.03.2010, 23:01
|
#4
|
Оператор ЭВМ
Регистрация: 24.02.2010
Сообщений: 29
Написано одно полезное сообщение
|
Ответ: большие тормоза при работе с FlashCard
Господа, а не потестите ли эту прогу на телефонах? В эмуляторе то работает, а вот в телефоне у меня зависает после открытия. ждал 10 минут, так ничего и не считалось. Если ставлю
skip(20);
str:=read_bytes(0,10);
то считывает. Вот и не понятно что не работает. Файл надо около 120-200 мегабайт чтобы был. Не важно что считается, главное чтобы все прошло нормально. И сама функция read_bytes(int off, int len) по сути должна считывать len байт начиная с off как я понял, но если я ставлю хотя бы 1 первым параметром, а не 0, то строка не возвращается. Поэтому я перед ней использую skip. Все бы хорошо, если бы работала на телефоне. Это родилось как идея в продолжение моего поста. Подумал что если поиск внутри одного но огромного файла будет быстрее то почему бы нет. А тут опять глюки. Потестите пожалуйста или предложите вариант чтения LEN байт по OFF смещению из файла. Спасибо!
program Files;
uses jsr75i;
var
nm,path,str: String;
o: Integer;
begin
path:='MemoryCard:/data/base.txt'; // файл размером 200 Мб. любой
o:=open_file(path);
if o=1 then DrawText('Открыто',0,0)
else DrawText('Ошибка!',0,0);
repaint;
skip(132407727); // смещение от начала файла
str:=read_bytes(0,10); // читаю 10 байт
DrawText(str,0,20);
DrawText(IntegerToString(length(str)),0,40);
o:=close_file(path);
if o=1 then DrawText('Закрыто',0,60)
else DrawText('Ошибка!',0,60);
repaint;
end.
|
(Offline)
|
|
10.03.2010, 01:59
|
#5
|
Модератор
Регистрация: 03.04.2007
Сообщений: 2,252
Написано 597 полезных сообщений (для 817 пользователей)
|
Ответ: большие тормоза при работе с FlashCard
Метод read_bytes сам является источником адских тормозов, поскольку читает данные побайтно. Читать файлы побайтно, да еще и с флешки с ее фрагментацией и т.д. очень тормозно.
С таким большим файлом мало какой телефон справится.
Набор файлов известен заранее (как в БД) или нет (просто данные пользователя)?
Если известен - составить заранее список, чтобы не использовать поиск + флеш дефрагментировать.
2 SBJoker: к сожалению, я пока не видел мобильников, держащих NTFS, да и ставить NTFS на 2-4 ГБ флеш ИМХО нерационально, слишком она "тяжелая" сама по себе.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
10.03.2010, 02:04
|
#6
|
Мастер
Регистрация: 06.09.2007
Адрес: Донецк, ДНР
Сообщений: 1,023
Написано 298 полезных сообщений (для 713 пользователей)
|
Ответ: большие тормоза при работе с FlashCard
К тому же NTFS при каждой операции с файлом все протоколирует (начало операции, конец операции, результат операции) что не прибавляет скорости при работе с файлами. Так что даже к счастью, что NTFS не поддерживается мобильниками.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
10.03.2010, 10:15
|
#7
|
Оператор ЭВМ
Регистрация: 24.02.2010
Сообщений: 29
Написано одно полезное сообщение
|
Ответ: большие тормоза при работе с FlashCard
ODD набор файлов известен и фиксирован. Дефрагментации нет так как я заливаю все разом на чистую флэш. Вот и хотел сделать из кучи мелких файлов один большой. И индексный файл где будут хранится названия файлов и смещения в огромном файле. Ну в общем типа FAT и получается. Но блин не прокатило у меня пока на примере выше. Сейчас буду пробовать на каком смещении повиснет. Буду увеличивать смещения. Может библиотека не поддерживает такие смещения...
|
(Offline)
|
|
10.03.2010, 10:29
|
#8
|
Злобный Админ
Регистрация: 04.09.2005
Сообщений: 5,926
Написано 3,415 полезных сообщений (для 9,330 пользователей)
|
Ответ: большие тормоза при работе с FlashCard
ну ntfs имеет массу преимуществ, хотя бы распределенная таблица fat с поиском файла по дереву что снижает число переборов до десятка, в то время как в fat32 поиск идёт полным перебором файлов.
К тому же в fat32 все файлы лежат в одной "папке", т.е. на одном уровне вложенности, отличия лишь в пути файла, который является частью имени файла, и вся строка от корня диска до имени файла и есть запись файла в fat32.
в ntfs файлы записываются вложенными и содержат только имена и ссылку на предка. потому поиск файла идёт последовательно по компонентам его пути, таким образом уже на первом шаге отсеиваются из перебора все файлы находящиеся в других подпапках диска.
Тормаза за флешкарт обусловлены физическим принцыпом записи. Данные в них хранятся в блоках большого размера, каждый блок имеет общий контакт стирания и подзарядки блока памяти. Другими словами флешкарты не могут стереть или записать избранный байт, только вместе со всем блоком в несколько килобайт. Поэтому запись одного байта на практике приводит к следующей последовательности: чтение всего блока памяти содержащего требуемый байт, запись байта в прочитанный блок, запись измененного блока обратно на карту.
Итог таков: записывать на карту лучше сразу подготовленными блоками из буфера, читать большие блоки в буфер. Т.е. организовать программный кеш.
__________________
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
10.03.2010, 11:00
|
#9
|
Оператор ЭВМ
Регистрация: 24.02.2010
Сообщений: 29
Написано одно полезное сообщение
|
Ответ: большие тормоза при работе с FlashCard
Попробовал считывать 10 байт постепенно увеличивая смещение. Получился тупняк. Если смещения до 100 000 байт (точно не стал выяснять сколько) то все работает быстро. Но потом стал делать смещения по мегабайтам и десяткам мегабайт и начались чудеса. В проге сделано так что после чтения 10 байт идет сразу вывод на экран содержимого и индекс. Так как содержимое квадратиками, то хоть как то идентифицировать. Так вот телефон думает 2 минуты. не выдает ни одного сообщения. Даже на 100 000 байтном смещении. Зато по прошествии 2 минут выдает сразу по всем смещениям данные. И 128 Мб в том числе. Repaint стоит после каждого DrawText тут я не ошибся. Такое впечатление что библиотека jsr75i как то глючит. Как будто буферизирует и пока все не считает не отдаст. Не знаю как это так может быть. Какие мысли?
А по поводу как работает flash, так это я знаю. Я делал Mp3 плеер на ней аппаратный. Блочное обращение к ней по 512 байт. Это ясно. Но работают они шустро (мне бы этой скорости хватило). Я то не пишу на нее, а только читаю.
Я то хотел этим экспериментом посмотреть на каком смещении у меня зависнет телефон. А оказалось что он как то ждет всех обращений к flash а потом пачкой выдает. Может есть другая библиотека для чтения N-байт файла по K-смещению?
|
(Offline)
|
|
10.03.2010, 12:06
|
#10
|
Оператор ЭВМ
Регистрация: 24.02.2010
Сообщений: 29
Написано одно полезное сообщение
|
Ответ: большие тормоза при работе с FlashCard
Еще выяснил что в lib_jsr75i не работает skip. Первый раз срабатывает, а последующие нет.
Пример: в файле содержится 12345_JFIF#6789
skip(6);
str:=read_bytes(0,2);
DrawText(str,0,20); // выдает JF
repaint;
skip(2); // должен сместить текущую позицию на 2 то есть #6
str:=read_bytes(0,2);
DrawText(str,0,40); // выдает IF
repaint;
я пробовал разные значение в skip, но срабатывает только один раз. Ставил Reset чтобы установить указатель в начало файла, но тоже не пашет.
|
(Offline)
|
|
10.03.2010, 13:00
|
#11
|
Оператор ЭВМ
Регистрация: 24.02.2010
Сообщений: 29
Написано одно полезное сообщение
|
Ответ: большие тормоза при работе с FlashCard
почитал форум... похоже дело-дрянь. у других тоже проблемы... новое никто н напишет. А на java это сделать можно? похоже придется переходить на java...
|
(Offline)
|
|
11.03.2010, 11:22
|
#12
|
Оператор ЭВМ
Регистрация: 24.02.2010
Сообщений: 29
Написано одно полезное сообщение
|
Ответ: большие тормоза при работе с FlashCard
ODD а как у тебя с java? мне бы простенькую програмку написать чтобы она на флэш диске из файла с заданным именем считывала 10 байт по указанному в меню смещению смещению? хочу проверить насколько выгоднее читать много меелких файлов или бороздить по одному огромному файлу. Я с java пока ноль, но чтобы начать надо знать получится ли моя затея или нет. Смогешь?
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 07:48.
|