2012-06-11 4 views
3

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

ABRDZ ....

Мой вопрос заключается в следующем , если голова расположена в начале файла, и мне нужно 5 символов каждые 1000 интервалов позиций, было бы лучше сделать Seek (так как я знаю, где искать) или просто иметь большой буфер, который просто читается последовательно, тогда делать работу в памяти.

Наивно я бы ответил, что чтение «A» тогда стремится прочитать «V» быстрее, чем >> чтение всего файла, пока, скажем, позиция 200 (позиция «V»). Хорошо, это просто пример, поскольку самый маленький ввод-вывод - 512 байт.

Редактировать: мой предыдущий самоуничтоженный ответ частично оправдывается следующим случаем: при использовании файла 100 Гб мне нужны первые и последние символы; Здесь я, очевидно, буду искать ... правильно?

Возможно, существует компромисс между тем, как «длинный» - это поиск, и сколько данных требуется получить?

Может кто-нибудь прояснить это мне?

+0

Огромное предположение, что файл является и останется непрерывным! –

+0

Правда, но должны быть способы гарантировать это, не так ли? Более того, дефрагментация приведет к большему повреждению последовательных чтений, чем к поиску. – DED

+0

Обеспечение соприкосновения не является бесплатным. Моделирование framented файлов менее прост. Я бы подумал, что это почти так же влияет на серийное чтение и поиск. Ужасно, поэтому с интервалом, который был «блоком или больше». –

ответ

0

[UPDATE] Как правило, от ваших исходных чисел 5 из каждых 1000, (Ill считать, что 5 байт является частью 1000, что делает Ваш подсчет 1000 шагов), если ваш счетчик шаг меньше 2х ваш размер блока, чем мой первоначальный ответ, является довольно хорошим объяснением. Это становится немного более сложным, если вы пройдете 2x размер вашего HD-блока, потому что в этот момент вы легко потеряете время чтения, когда сможете ускорить поиск ненужных (или, если на то пошло, ненужных) HD-блоков.

[ОРИГИНАЛ] Ну, это очень интересный вопрос, с тем, что я считаю, чтобы быть столь же интересный ответ (также несколько сложных). Я думаю, что на самом деле это сводится к нескольким другим вопросам, например, насколько большой размер блока, который вы реализовали на своем диске (или диск, на котором будет работать ваше программное обеспечение). Если размер вашего блока равен 4 КБ, тогда минимальный (true) минимальный размер вашего жесткого диска для вас составляет 4096 байт. В вашем случае, если вам действительно нужно 5 символов каждые 1000, то, если вы сделали это со ВСЕМИ дисковым IO, тогда вы по существу перечитывали один и тот же блок 4 раза и делали бы 3 раза между ними (ДЕЙСТВИТЕЛЬНО НЕ ЭФФЕКТИВНЫМ).

Мое личное убеждение состоит в том, что вы могли бы (если бы вы хотели быть эффективным приводом) в своем коде, попытайтесь понять, какой размер блока вашего диска вы используете, затем используйте этот размер, чтобы узнать, сколько байтов в то время вы должны принести в ОЗУ. Таким образом, у вас не должно быть ОГРОМНОГО RAM-буфера, но в то же время на самом деле не нужно SEEK, вы не будете тратить (или выполнять) какие-либо дополнительные чтения.

ЭТО НАИБОЛЕЕ ЭФФЕКТИВНО. Я не думаю, что это самый эффективный, но он может быть достаточно хорош для производительности, в которой вы нуждаетесь, кто знает. Я думаю, что даже если голова чтения - это то место, где вы хотите, чтобы это было, если вы выполняете алгоритмическую работу в середине каждого блока, а не читаете весь файл сразу, что вы потеряете время в ожидании следующее вращение дисков. Если вы должны были прочитать все сразу, диск должен иметь возможность выполнять последовательное чтение всех частей файла одновременно. Опять же, не так просто, как если бы ваш файл был действительно более одного блока, на вращающемся диске вы можете пострадать, если ваш диск не был дефрагментирован, так как может потребоваться выполнить случайные запросы, чтобы перейти к следующему блоку.

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

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

+0

Я добавил еще один специальный случай в начале моего ответа !!! – trumpetlicks

+0

Aha! Спасибо, вы коснулись права на мою проблему «если ваш счетчик шагов меньше 2x вашего размера блока». Похоже, что критерий для поиска лучше. У вас есть ссылка на это? – DED

+0

К сожалению, у меня нет ссылки на это, это из моего собственного опыта :-) Извините .... – trumpetlicks