forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Основной форум (http://forum.boolean.name/forumdisplay.php?f=49)
-   -   большие тормоза при работе с FlashCard (http://forum.boolean.name/showthread.php?t=12159)

Roman_V 09.03.2010 14:21

большие тормоза при работе с FlashCard
 
на флэшке есть куча файлов (>5000). и при поиске файлов проходит 10 секунд до того как найдет. Карту попробую поменять, сформатировать. Разбить на подкаталоги не могу. есть предложения как ускорить процесс доступа к файлам?
средствами телефона по папке гуляю, но это не показатель. так как моя скорость нажатия на кнопки куда ниже чем поиск :-D

SBJoker 09.03.2010 15:03

Ответ: большие тормоза при работе с FlashCard
 
Флешкарты очень слабы в random-access доступе, однако форматирование карты в ntfs может решить эту проблему отчасти. Однако невсе устройства ntfs понимают.

odd 09.03.2010 16:38

Ответ: большие тормоза при работе с FlashCard
 
Лучше распихать всё по подпапкам (где-то по 100 файлов), хоть какой-то прирост производительности.

Roman_V 09.03.2010 23:01

Ответ: большие тормоза при работе с 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.

ViNT 10.03.2010 01:59

Ответ: большие тормоза при работе с FlashCard
 
Метод read_bytes сам является источником адских тормозов, поскольку читает данные побайтно. Читать файлы побайтно, да еще и с флешки с ее фрагментацией и т.д. очень тормозно.

С таким большим файлом мало какой телефон справится.

Набор файлов известен заранее (как в БД) или нет (просто данные пользователя)?

Если известен - составить заранее список, чтобы не использовать поиск + флеш дефрагментировать.

2 SBJoker: к сожалению, я пока не видел мобильников, держащих NTFS, да и ставить NTFS на 2-4 ГБ флеш ИМХО нерационально, слишком она "тяжелая" сама по себе.

odd 10.03.2010 02:04

Ответ: большие тормоза при работе с FlashCard
 
К тому же NTFS при каждой операции с файлом все протоколирует (начало операции, конец операции, результат операции) что не прибавляет скорости при работе с файлами. Так что даже к счастью, что NTFS не поддерживается мобильниками.

Roman_V 10.03.2010 10:15

Ответ: большие тормоза при работе с FlashCard
 
ODD набор файлов известен и фиксирован. Дефрагментации нет так как я заливаю все разом на чистую флэш. Вот и хотел сделать из кучи мелких файлов один большой. И индексный файл где будут хранится названия файлов и смещения в огромном файле. Ну в общем типа FAT и получается. Но блин не прокатило у меня пока на примере выше. Сейчас буду пробовать на каком смещении повиснет. Буду увеличивать смещения. Может библиотека не поддерживает такие смещения...

SBJoker 10.03.2010 10:29

Ответ: большие тормоза при работе с FlashCard
 
ну ntfs имеет массу преимуществ, хотя бы распределенная таблица fat с поиском файла по дереву что снижает число переборов до десятка, в то время как в fat32 поиск идёт полным перебором файлов.

К тому же в fat32 все файлы лежат в одной "папке", т.е. на одном уровне вложенности, отличия лишь в пути файла, который является частью имени файла, и вся строка от корня диска до имени файла и есть запись файла в fat32.

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

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

Итог таков: записывать на карту лучше сразу подготовленными блоками из буфера, читать большие блоки в буфер. Т.е. организовать программный кеш.

Roman_V 10.03.2010 11:00

Ответ: большие тормоза при работе с FlashCard
 
Попробовал считывать 10 байт постепенно увеличивая смещение. Получился тупняк. Если смещения до 100 000 байт (точно не стал выяснять сколько) то все работает быстро. Но потом стал делать смещения по мегабайтам и десяткам мегабайт и начались чудеса. В проге сделано так что после чтения 10 байт идет сразу вывод на экран содержимого и индекс. Так как содержимое квадратиками, то хоть как то идентифицировать. Так вот телефон думает 2 минуты. не выдает ни одного сообщения. Даже на 100 000 байтном смещении. Зато по прошествии 2 минут выдает сразу по всем смещениям данные. И 128 Мб в том числе. Repaint стоит после каждого DrawText :) тут я не ошибся. Такое впечатление что библиотека jsr75i как то глючит. Как будто буферизирует и пока все не считает не отдаст. Не знаю как это так может быть. Какие мысли?

А по поводу как работает flash, так это я знаю. Я делал Mp3 плеер на ней аппаратный. Блочное обращение к ней по 512 байт. Это ясно. Но работают они шустро (мне бы этой скорости хватило). Я то не пишу на нее, а только читаю.

Я то хотел этим экспериментом посмотреть на каком смещении у меня зависнет телефон. А оказалось что он как то ждет всех обращений к flash а потом пачкой выдает. :4to: Может есть другая библиотека для чтения N-байт файла по K-смещению?

Roman_V 10.03.2010 12:06

Ответ: большие тормоза при работе с 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 чтобы установить указатель в начало файла, но тоже не пашет.

Roman_V 10.03.2010 13:00

Ответ: большие тормоза при работе с FlashCard
 
почитал форум... похоже дело-дрянь. :( у других тоже проблемы... новое никто н напишет. А на java это сделать можно? похоже придется переходить на java...

Roman_V 11.03.2010 11:22

Ответ: большие тормоза при работе с FlashCard
 
ODD а как у тебя с java? мне бы простенькую програмку написать чтобы она на флэш диске из файла с заданным именем считывала 10 байт по указанному в меню смещению смещению? хочу проверить насколько выгоднее читать много меелких файлов или бороздить по одному огромному файлу. Я с java пока ноль, но чтобы начать надо знать получится ли моя затея или нет. Смогешь?


Часовой пояс GMT +4, время: 08:34.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot