Самый быстрый доступ к файлу / устройство хранения данных?

Вы можете использовать одну из этих платформ, если вы хотите написать код, который работает в сети.

Например, если вы собирались написать многопользовательскую видеоигру , «настройка программы Java ... для отправки потока для каждого запроса», вероятно, не вариант; манипулирование многими потоками является феноменально сложным, а также плохо работает. Не говоря уже о том, что «просто порождаем кучу потоков» отсутствует куча инструментов управления, которые Twisted et. и др. иметь, как twistd, который обрабатывает журналирование, демонизацию, запуск и завершение работы и т. д.

Или, если вы хотите написать систему автоматизации сборки , была бы полезна возможность асинхронного вызова и управления подпроцессами . Если вы запускаете процесс асинхронно, вы можете легко убить этот процесс и корректно обработать его выход. Если вы породите его, запустив поток и заблокировав его, вы не сможете легко его остановить, поскольку остановка потока небезопасна .

EventMachine и Twisted могут использоваться для написания программ на стороне клиента; возможно, вы пишете приложение с графическим интерфейсом, которое не основано на веб-технологиях, и вы хотите использовать одну и ту же реализацию протокола на клиенте и сервере.

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

6
задан JamesBrownIsDead 7 November 2009 в 06:59
поделиться

9 ответов

Этот файловый алгоритм будет работать, но он не оптимален. d: \ хранилище \ fo \ ob \ ar \ foobar.txt
или
d: \ storage \ foo \ bar \ foobar.txt

Есть некоторые преимущества использования этого типа алгоритма:

  1. Нет необходимости в доступе к базе данных.
  2. Файлы будут распределены по многим каталогам. Если их не разложить, вы столкнетесь с серьезными проблемами с производительностью. (Я смутно припоминаю, что слышал о проблемах с ~ 40 000 файлов в одной папке, но я не уверен в этом числе.)
  3. Нет необходимости искать файл. Вы можете определить, где именно будет находиться файл, по имени файла.
  4. Простота. Вы можете очень легко перенести этот алгоритм практически на любой язык.

У этого также есть некоторые недостатки:

  1. Многие каталоги могут привести к медленному резервному копированию. Представьте себе рекурсивное сравнение этих каталогов.
  2. Масштабируемость. Что происходит, когда у вас заканчивается место на диске и вам нужно добавить дополнительное пространство?
  3. Имена ваших файлов не могут содержать пробелов.
2
ответ дан 17 December 2019 в 00:11
поделиться

Это сильно зависит от многих факторов:

  • Какую файловую систему вы используете?
  • Насколько велик каждый файл?
  • Какие типы дисков вы используете?
  • Каковы шаблоны доступа?

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

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

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

Обновление:

С учетом вашего обновления, возможно ли объединить некоторые файлы? Файлы размером 1k не очень эффективно хранить в виде файловых систем (fat32, ntfs) имеют размер кластера, и каждый файл в любом случае будет использовать размер кластера, даже если он меньше размера кластера. Обычно существует ограничение на количество файлов в каждой папке из-за проблем с производительностью. Вы можете выполнить простой тест, поместив в папку до 10 КБ файлов, чтобы увидеть, насколько снизится производительность.

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

1
ответ дан 17 December 2019 в 00:11
поделиться

Во-первых, размер файла очень маленький. Любая файловая система съест что-то вроде как минимум в 4 раза больше места. Я имею в виду, что любой файл на диске будет занимать 4 КБ для файла 1 КБ. Сектор размером 4 Кбайт будет нормой, особенно на SSD-дисках.

Поэтому вам нужно сгруппировать несколько файлов в один физический файл. 1024 файла на 1 файл хранилища кажется разумным. Чтобы найти отдельные файлы в этих файлах хранилища, вам нужно использовать какую-нибудь СУБД (упоминался PostgreSQL, и это хорошо, но SQLite может лучше подходит для этого) или аналогичную структуру для сопоставления.

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

Если можете, не позволяйте им форматироваться как FAT32, по крайней мере, NTFS или какой-нибудь недавний вариант файловой системы Unix. Поскольку общий размер файлов невелик, NTFS может быть достаточно, но ZFS - лучший вариант ...

1
ответ дан 17 December 2019 в 00:11
поделиться

Почему недопустимо хранить пути в таблице базы данных?

0
ответ дан 17 December 2019 в 00:11
поделиться

Я предполагаю, что он думает о структуре данных Trie для создания на диске, где узел является каталогом.

0
ответ дан 17 December 2019 в 00:11
поделиться

Я бы посмотрел на модель hadoops .

P

0
ответ дан 17 December 2019 в 00:11
поделиться

Это в значительной степени зависит от того, в какой файловой системе вы собираетесь хранить файлы. Возможности файловых систем по работе с большим количеством файлов сильно различаются.

Ваш коллега по существу предлагает использовать структуру данных Trie . Использование такой структуры каталогов означало бы, что на каждом уровне каталогов есть только несколько файлов / каталогов на выбор; это может помочь, поскольку количество файлов в каталоге увеличивает время доступа к одному из них (реальная разница во времени зависит от типа файловой системы).

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

Кроме того, я бы сохранил сам файл с его полным именем, это упростит обход этой структуры каталогов вручную, если потребуется.

Итак, я бы сохранил foobar.txt как f / o / o / b / foobar.txt

1
ответ дан 17 December 2019 в 00:11
поделиться

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

0
ответ дан 17 December 2019 в 00:11
поделиться

Похоже, это будет в основном вопрос выбора файловой системы. Один из вариантов, на который стоит обратить внимание, может быть ZFS , он разработан для приложений большого объема.

Вы также можете рассмотреть возможность использования реляционной базы данных для такого рода вещей. 750 миллионов строк - это своего рода база данных среднего размера, поэтому любая надежная СУБД (например, PostgreSQL ) сможет с ней справиться. Вы также можете хранить произвольные капли в базе данных, поэтому все, что вы собирались хранить в файлах на диске, вы можете просто сохранить в самой базе данных.

Обновление: Ваша дополнительная информация, безусловно, будет полезна. Если есть выбор между FAT32 и NTFS, то определенно выберут NTFS. Не храните слишком много файлов в одном каталоге, 100, 000 может быть верхним пределом, который следует учитывать (хотя вам придется поэкспериментировать, здесь нет жесткого правила). Предложение вашего друга о новом каталоге для каждой буквы, вероятно, слишком много, вы можете подумать о том, чтобы разбивать его на каждые четыре буквы или что-то в этом роде. Лучшее значение для выбора зависит от формы вашего набора данных.

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

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

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

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

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

Лучшее значение для выбора зависит от формы вашего набора данных.

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

Лучшее значение для выбора зависит от формы вашего набора данных.

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

2
ответ дан 17 December 2019 в 00:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: