Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.03.09;
Скачать: CL | DM;

Вниз

Экономия памяти при работе.   Найти похожие ветки 

 
Riply ©   (2008-02-01 17:16) [0]

Здравствуйте !
Допустим, нам надо просканировать диск, двумя разными способами
и сравнить результаты.
При сканировании создается блок памяти (для каждого способа),
в который записывается информация о всех найденых объектах.
Итого имеем два больших блока.
С ними и пойдет дальнейшая работа.
Средний размер записи для объекта:
AverageRecordSize       212
в него входит размер имени
AverageObjNameLen       148 (размер в байтах, само имя в UNICODE)

Допустим мы исследуем диск с миллионом объектов.
Соответсвенно нам понадобиться два блока памяти
по 212 MB (212 * 1000000), итого почти пол гигабайта.
Если же хранить имена в ANSI, то
в этом случае для работы нам будет требоваться
два блока по 138 MB (138 * 1000000), итого чуть больше четверти гигабайта.
Стоит ли ради экономии памяти переходить на хранение имен в ANSI ?
(Очень не хочеться это делать)

P.S.
Размер структуры (без имени 64 B) приведен для Debug варианта.
В реальной работе он будет примерно 36 Byte.


 
Rouse_ ©   (2008-02-01 17:42) [1]

Если хранение имен не принципиально - то может имеет смысл хранить только их хэш? :)


 
Riply ©   (2008-02-01 17:45) [2]

> [1] Rouse_ ©   (01.02.08 17:42)
> Если хранение имен не принципиально - то может имеет смысл хранить только их хэш? :)

От имен требуется толко одно:
после обработки иметь возможность показать пользователю скрытые (не стандартные объекты)


 
Rouse_ ©   (2008-02-01 17:48) [3]

Храни имена в ANSII + в Short формате - еще меньше памяти бу :)


 
Riply ©   (2008-02-01 17:49) [4]

>  [2] Riply ©   (01.02.08 17:45)
Внутри программы идентификатором объекта (если он не поток)
является не имя, а номер файловой записи в MFT.


 
Джо ©   (2008-02-01 17:52) [5]

Сохранить все имена во временный файл, при запросе читать оттудова поодиночке :)


 
antonn ©   (2008-02-01 18:04) [6]

а имена потом нельзя вывести? :)


 
Игорь Шевченко ©   (2008-02-01 18:27) [7]

Дварковать диск влэндишным способом.


> Допустим мы исследуем диск с миллионом объектов.
> Соответсвенно нам понадобиться два блока памяти
> по 212 MB (212 * 1000000), итого почти пол гигабайта.


И чего ? Тебя это так смущает ?


> От имен требуется толко одно:
> после обработки иметь возможность показать пользователю
> скрытые (не стандартные объекты)


Ну так удаляй стандартные объекты по мере их опознания. Почему бы (для NTFS, насколько я понимаю) не хранить fileno объекта вместо его имени ? А после нахождения всех "нестандартных" получать имя объекта по этому fileno ?

Или я чего-то не понимаю ?


 
Riply ©   (2008-02-01 19:10) [8]

> [7] Игорь Шевченко ©   (01.02.08 18:27)

> Дварковать диск влэндишным способом.

А можно пояснить (перевести) эту фразу ?
Уж очень напоминает "Сильпуете ли Вы Машек валически ?"  :)
(с) Искаверканная, т.к. дословно не помню.

> И чего ? Тебя это так смущает ?

Ага. Уж очень астрономические цифры получаются :)

> Ну так удаляй стандартные объекты по мере их опознания.

Блок памяти выделяется заранее (один на всех) и туда,
как кирпичики дописываются новые объекты. Так что удалить сложновато.
Такой подход обусловлен форматом данных возвращаемых используемыми Nt - функциями.

> Почему бы (для NTFS, насколько я понимаю) не хранить fileno объекта вместо его имени ?
> А после нахождения всех "нестандартных" получать имя объекта по этому fileno ?
> Или я чего-то не понимаю ?

Все верно. Думала об этом. Есть несколько "но".
Первое:
"получать имя объекта по этому fileno" не очеь быстрая операция.
Может есть какая-то ф-ия ? Потому что если "в лоб через MFT", то для объекта
придется считывать не только его запись, но и запись родителя (для вытаскивания имени родителя)
Второе:
Объекты типа STREAM идентифицируются не fileno, а именам.


 
guav ©   (2008-02-01 19:14) [9]

> AverageObjNameLen       148

Т.е. 74 символа ? Многовато. Это с полными путями, что ли ?


 
Riply ©   (2008-02-01 19:17) [10]

> [8] Riply ©   (01.02.08 19:10)
> Объекты типа STREAM идентифицируются не fileno, а именам.

Некузяво выразилась.
Объекты типа STREAM идентифицируются связкой: fileno + имя.


 
Riply ©   (2008-02-01 19:19) [11]

>  [9] guav ©   (01.02.08 19:14)
> Т.е. 74 символа ? Многовато. Это с полными путями, что ли ?

Да. Сейчас я рассматриваю вариант с полными путями.


 
Игорь Шевченко ©   (2008-02-01 19:31) [12]

Riply ©   (01.02.08 19:10) [8]


> А можно пояснить (перевести) эту фразу ?
> Уж очень напоминает "Сильпуете ли Вы Машек валически ?"
>  :)
> (с) Искаверканная, т.к. дословно не помню.


Это оттуда же. Из рассказов Роберта Шекли


> Ага. Уж очень астрономические цифры получаются :)


Так ты имена не храни и цифры сразу станут не астрономическими.


> Блок памяти выделяется заранее (один на всех) и туда,
> как кирпичики дописываются новые объекты. Так что удалить
> сложновато.
> Такой подход обусловлен форматом данных возвращаемых используемыми
> Nt - функциями.


Вряд ли Nt-функция обеспечит работу при объеме данных, превосходящем стандартные 2 гигабайта пользовательского адресного пространства. Впрочем, это можно проверить, создав каталог с несколькими миллионами мелких файлов и вызвав NtQueryDirectoryInformation, например.
Поэтому все объемы, лежащие ниже этого могут не приниматься во внимание - ну разве что своппинг будет.


> "получать имя объекта по этому fileno" не очеь быстрая операция.


Если она нечастая, то какая, собственно, беда от того, что она небыстрая ?

> Второе:
> Объекты типа STREAM идентифицируются не fileno, а именам.
>


Кто-то мешает хранить составной идентификатор ? fileno и имя потока данных, например.

Я к чему клоню - может быть, есть смысл для хранения нужных тебе объектов завести совершенно отдельную структуру.

Я понимаю, конечно, что просканировать диск два раза, загнав все  содержимое его каталогов в память, это кульно и рульно, но какой смысл сравнивать %SystemRoot%\System32\Kernel32.dll с самим собой, ища каждый из них среди миллиона файлов ?
А таких сравнений всяко будет.
Не проще ли, как делает Руссинович, сравнивать содержимое конкретного каталога, полученное двумя разными способами, и хранить разницу отдельно.
Разумеется, если у тебя окажется каталог с миллионами файлов, проблемы памяти все равно будут наличествовать, но, на мой взгляд, ситуация не так часто встречающаяся, и ради редких случаев, можно и потерпеть.


 
Riply ©   (2008-02-01 20:03) [13]

> [12] Игорь Шевченко ©   (01.02.08 19:31)

> Это оттуда же. Из рассказов Роберта Шекли
:)

> Впрочем, это можно проверить, создав каталог с несколькими миллионами мелких файлов и
> вызвав NtQueryDirectoryInformation, например.
> Поэтому все объемы, лежащие ниже этого могут не приниматься во внимание - ну разве что своппинг будет.

Попробую проверить :)

> Кто-то мешает хранить составной идентификатор ? fileno и имя потока данных, например.

> Я к чему клоню - может быть, есть смысл для хранения нужных тебе объектов завести совершенно отдельную структуру.

> Я понимаю, конечно, что просканировать диск два раза, загнав все  содержимое его каталогов в память, это кульно и рульно, но какой смысл > сравнивать %SystemRoot%\System32\Kernel32.dll с самим собой, ища каждый из них среди миллиона файлов ?
> А таких сравнений всяко будет.
> Не проще ли, как делает Руссинович, сравнивать содержимое конкретного каталога,
> полученное двумя разными способами, и хранить разницу отдельно.

Самое интересное, что в работе мне имена, можно считать, не нужны.
Благо NtQueryDirectoryInformation предоставляет возможность
получать объекты, сразу вместе с их fileno.
Так что в сортировке и сравнении блоков, имена не участвуют - все идет через номер. :)

> Так ты имена не храни и цифры сразу станут не астрономическими.

Так жалко выкидывать имена, добытые потом и кровью :)
Видимо так и придется сделать, если ничего не сумею придумать.


 
Игорь Шевченко ©   (2008-02-01 21:33) [14]

Riply ©   (01.02.08 20:03) [13]


> Так жалко выкидывать имена, добытые потом и кровью :)


А зачем их выкидывать - они себе в MFT преспокойно лежат, ждут когда их по fileno достанут.


 
guav ©   (2008-02-02 18:33) [15]

> [11] Riply ©   (01.02.08 19:19)

Я бы рассмотрел вариант, когда имена содержат ссылки на их начала. Т.е. stringlist:
pathParts[0] = "\", object = -1
pathParts[1] = "My Documents", object = 0
pathParts[2] = "Pictures", object = 1
pathParts[3] = "Music", object = 1

\My Documents\Pictures\ кодируется как 2, а \My Documents\Pictures\Music\ - как 3.

Или вариант когда имя - массив из индексов его кусков в стринглисте.
т.е.
pathParts[0] = "\"
pathParts[1] = "My Documents"
pathParts[2] = "Pictures"
pathParts[3] = "Music"
\My Documents\Pictures\ кодируется как {0, 1, 2}, а \My Documents\Pictures\Music\ - как {0, 1, 3}.

Чтобы сэкономить больше, можно не сохранять (или старатся не сохранять) все повторяющиеся части:
повторящиеся имена файлов в разных папках, повторяющиеся имена атрибутов, повторяющиеся имена папок
на разных дисках. Но, возможно, не получится реализовать это с достаточным быстродействием.
Для обычного несортированного стринглиста поиск дупликатов не эффективен, а сортированный не будет
иметь фиксированных индеков.
Можно иметь sorted stringlist для отсева дупликатов, в его объектах индексы несортированного.
Можно попробвать использовать более хитрую структуру с поиском дупликатов по хешам (можно посмотреть
как THashedStringList работает).


 
ANTPro ©   (2008-02-02 19:03) [16]

> [15] guav ©   (02.02.08 18:33)
> pathParts[3] = "Music", object = 1

А не pathParts[3] = "Music", object = 2 ?


 
Riply ©   (2008-02-02 23:00) [17]

>  [14] Игорь Шевченко ©   (01.02.08 21:33)
> А зачем их выкидывать - они себе в MFT преспокойно лежат, ждут когда их по fileno достанут.

>  [15] guav ©   (02.02.08 18:33)
> Я бы рассмотрел вариант, когда имена содержат ссылки на их начала.

После тяжких раздумий и ожесточенной борьбы с жадностью,
остановилась на следующем варианте:
Остаемся в UNICODE.
Для объектов типа директория храним полные пути.
(уходим от пробежки по цепочке Parents в MFT для получения полного имени)
Для объектов типа файл, в зависимости от параметра(настроек)
либо храним короткое имя, либо нет.
Для объектов типа поток храним имя.
В запись объекта добавляется поле ObjParent.
По предварительным оценкам AverageRecordSize будет от 48 до 80 байт.
Т.е. (для диска с миллионом объектов) на два блока,
потребуется, примерно, от 96 до 160 MB.
Это приемлемые цифры для работы или лучше попробовать ужаться еще ?


 
Игорь Шевченко ©   (2008-02-02 23:03) [18]


> Это приемлемые цифры для работы или лучше попробовать ужаться
> еще ?


Полгигабайта тоже вполне приемлемая цифра :)
Я серьезно. Ну где ты возьмешь диск с миллионом объектов. Другое дело, что у тебя может сильно тормозить поиск и сравнение в таком массиве - я бы все-таки как-то организовал.

А что ты ввобще с этой информацией собираешься делать - зачем файлы-то коллекционируешь ?


 
ketmar ©   (2008-02-03 00:40) [19]

>[15] guav ©(02.02.08 18:33)
кстати, да. это string ropes называется, что ли…


 
Riply ©   (2008-02-03 04:44) [20]

> [18] Игорь Шевченко © (02.02.08 23:03)

> Полгигабайта тоже вполне приемлемая цифра :)
Да меня даже не от смысла, а только от того как звучит фраза:
"Потребуется не более полугигабайта памяти", бросает в дрожь :)

> Я серьезно. Ну где ты возьмешь диск с миллионом объектов.
Мне такой достать негде, а вот пользователь что нибудь да придумает :)

> Другое дело, что у тебя может сильно тормозить поиск и сравнение
> в таком массиве - я бы все-таки как-то организовал.
Здесь чуть-чуть полегче, т.к. и ищем и сортируем по FileReferenceNumber, а не по именам.
И потом, два блока требуются только для сравнения, после этого Nt-шный блок
сразу освобождается. Остальная работа идет только с блоком от MFT.

> А что ты ввобще с этой информацией собираешься делать - зачем файлы-то коллекционируешь ?
Да вот, в свое время, не слушалась старших, умудренных опытом людей. :)
Теперь приходиться расхлебывать. Ну не бросать же все на пол-пути в самом деле :)
Цель не только показать пользователю, все что спрятано от API ф-ий,
"не стандартно" или к чему его "не пускают",
но и предоставить хоть какой-то инструмент для работы с этими "объектами".
(Чтение, копирование, вероятно - затирание, и в идеале - удаление.)
Последнее - самое сложное, врядли буду пытаться реализовать.
Последствия такой "работы" на совести пользователя - должен понимать что делает :)


 
TUser ©   (2008-02-03 09:55) [21]

Миллион не миллион, а вот пости сто тысяч файлов у меня сейчас есть в одной папке.


 
Riply ©   (2008-02-03 10:57) [22]

> [21] TUser ©   (03.02.08 09:55)
> Миллион не миллион, а вот пости сто тысяч файлов у меня сейчас есть в одной папке.

Надеюсь не в ее корне ?
Или моим надеждам не суждено сбыться ? :)


 
Anatoly Podgoretsky ©   (2008-02-03 11:10) [23]

> Riply  (03.02.2008 04:44:20)  [20]

Создай сама, Ctrl+C/Ctrl+V


 
Riply ©   (2008-02-03 11:18) [24]

>  [23] Anatoly Podgoretsky ©   (03.02.08 11:10)
> Создай сама, Ctrl+C/Ctrl+V

Создать то не проблемма.
Но для этого лучше взять диск, который потом можно будет форматировать,
ибо другого способа приведения MFT в "нормальное" состояние я не знаю :)
(Дефрагментация не поможет)


 
Anatoly Podgoretsky ©   (2008-02-03 11:27) [25]

Сами мы не местные.


 
ketmar ©   (2008-02-03 12:16) [26]

>[24] Riply©(03.02.08 11:18)
а ничего с MFT не будет, если ты файлы не по 12–14 байт будешь делать. иначе да — в драйвере NTFS был баг: забыли проверить «выпадение» из MFT. может, уже починили, не знаю.


 
guav ©   (2008-02-03 13:19) [27]

> [17] Riply ©   (02.02.08 23:00)
> Т.е. (для диска с миллионом объектов) на два блока,
> потребуется, примерно, от 96 до 160 MB.

Ну я считаю что уже норамльно. Если вариант не сохранять вообще не рассматривается то на этом можно и остановится.


> [19] ketmar ©   (03.02.08 00:40)
> это string ropes называется

То есть велосипед уже изобретён, изготовлен и упакован ? Тогда тем более стоит рассмотреть использование.


> [26] ketmar ©   (03.02.08 12:16)

Если создать миллион файлов, то MFT потребуется вырасти на около миллиона записей (запись обычно килобайт, т.е. это будет около гигабайта). Удаление файлов не приведёт к уменьшению. Т.е. уже гигабайт будет пропадать зря. А если  MFT не будет места расти нефрагментированно, она будет расти и фрагментироватся. А это уже и серьёзные проблемы с производительностью, и баг во многих програмах, включая даже Windows NT, которая перестанет загружатся - http://www.google.com.ua/search?hl=ru&q=highly+fragmented+MFT&meta= .


 
ketmar ©   (2008-02-03 13:39) [28]

>[27] guav ©(03.02.08 13:19)
>То есть велосипед уже изобретён, изготовлен и упакован ?
угу. правда, я не уверен, что правильно его назвал. но ropes там точно было.

>Если создать миллион файлов, то MFT потребуется вырасти на около миллиона
>записей

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

впрочем, спорить не стану, ибо давно оно было, не правда, и не помню я кишок NTFS. у нашего райзера такой ерунды нет. %-)


 
guav ©   (2008-02-03 14:06) [29]

> [28] ketmar ©   (03.02.08 13:39)
> в MFT пихаются именно что маленькие файлы. если же файлы
> большие — там несколько другая кухня, кажется.

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

Заинтриговал своим райзером, это очередная UFS/Ext подобная система или что-то другое ? Полез гуглить...


 
ketmar ©   (2008-02-03 14:07) [30]

>[29] guav ©(03.02.08 14:06)
в общем-то очередная журналируемая система. ничего суперноваторского.


 
Zeqfreed ©   (2008-02-03 14:27) [31]

> ketmar ©   (03.02.08 14:07) [30]

Там используются танцующие деревья. Это уже звучит интересно :)


 
guav ©   (2008-02-03 14:57) [32]

Сравнение ФС.
http://en.wikipedia.org/wiki/Comparison_of_file_systems
http://en.wikipedia.org/wiki/List_of_file_systems


 
ketmar ©   (2008-02-03 15:06) [33]

>[31] Zeqfreed ©(03.02.08 14:27)
я же не говорю, что неинтересно. я говорю, что ничего суперноваторского. просто родная (гляньте список программеров %-) и надёжная.


 
Riply ©   (2008-02-03 18:41) [34]

> [26] ketmar ©   (03.02.08 12:16)
> а ничего с MFT не будет

Неравда Ваша. :)
MFT очень нежна, черезвычайно ранима и совершенно(ну... почти) не способна к регенерации :)
Или MFT это "он" ?


 
ketmar ©   (2008-02-03 18:49) [35]

>[34] Riply©(03.02.08 18:41)
это «оно». %-)

емнип, с достаточно большими файлами ничего страшного, кроме тормозов, не случается. а вот с мелкими — там можно MFT развалить только так.


 
Michael   (2008-02-03 19:13) [36]

Похоже ветка выродилась и ее искусственно вытягивают (поднимают), хотя начало было интересным и интригующим:(



Страницы: 1 вся ветка

Текущий архив: 2008.03.09;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.218 c
2-1202714361
gerda
2008-02-11 10:19
2008.03.09
dephi unix


15-1202038145
Галинка
2008-02-03 14:29
2008.03.09
Вопрос к преподавателям


15-1201715595
oxffff
2008-01-30 20:53
2008.03.09
Ищу работу.


15-1201787088
saNat
2008-01-31 16:44
2008.03.09
Подскажите, пожалуйста, м... компонент для отображения формул


11-1184956052
=BuckLr=
2007-07-20 22:27
2008.03.09
Иконка апплета - проблема