Проблема на теге “файловая система”

Для больших расстояний используйте формулу Хаверсайна для точности. На коротких дистанциях Пифагор в два раза быстрее.

16 значащих цифр (тип данных DOUBLE) смешны. Вам не нужно различать двух разных блох на вашей собаке.

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

Еще несколько подробностей здесь: http://mysql.rjweb.org/doc.php/latlng

Если 1.6054631070094885 является разницей по широте, то подумайте об этом следующим образом : Если вы и я на одной долготе, но наши широты равны 1.605463 и 1.605464, то, ну, я не знаю вас достаточно хорошо, чтобы быть , что близко.

Невозможно сравнивать два значения с плавающей запятой без фактора выдумки:

If abs(a-b) < 0.00001, then treat them as equal.

Подробнее

Я рекомендую FLOAT для lat, lng и расстояние, так как вы говорите о ресторанах. Если вы говорите не более чем о, скажем, 100 милях или километрах, то это выражение достаточно точное:

SQRT(  ($lat - lat) *
       ($lat - lat) +
      (($lng - lng) * COS(RADIANS(lat))) *
      (($lng - lng) * COS(RADIANS(lat))) )  * $factor

Где ...

  • lat и lng являются именами FLOAT столбцов в таблице, в единицах градусов.
  • $lat и $lng - это значения местоположения, с которого вы начинаете, также в градусах. (PHP использует $; другие языки используют другие соглашения.)
  • $factor составляет 69,172 для миль или 111,325 для километров.
  • Я бы не отображал результат с более чем одним десятичным знаком. (Не показывать «12,345678 миль»; «12,3 миль» достаточно хорошо.)

Сравнение Пифагора и GCD:

             Pyt        GCD
To Rennes:  93.9407    93.6542
To Vannes:  95.6244    95.6241

5
задан Alix Axel 22 May 2009 в 23:55
поделиться

13 ответов

Если вы используете жесткие / программные ссылки, то вы можете подумать о том, чтобы дать каждому тегу его собственный каталог, содержащий ссылку на каждый файл с этим «тегом». Затем, когда вам дается несколько тегов, вы можете сравнить те, которые есть в обоих. Тогда файлы можно было бы хранить в одной папке и иметь, конечно, уникальное имя.

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

16
ответ дан 18 December 2019 в 05:44
поделиться

Вы должны создать каталоги тегов вместо элементов имени файла, т.е. вместо /dir/tag1+tag2+tagN+MD5.EXT , / dir / tag1 /tag2/tagN/MD5.EXT . Вы стреляете себе в ногу несколькими способами, рассматривая иерархию каталогов как нечто, чего следует избегать.

Если вы участвуете в этом избегании, потому что считаете, что сложно создать структуру каталогов по требованию, вам следует изучить третий аргумент, $ recursive , для mkdir PHP .

0
ответ дан 18 December 2019 в 05:44
поделиться

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

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

4
ответ дан 18 December 2019 в 05:44
поделиться

весь смысл тегов состоит в том, чтобы иметь возможность быстро искать несколько комбинаций тегов. в идеале вы хотите иметь базу данных с таблицей тегов {tag, path-to-file}. если вы настроили хранить свои теги в имени файла, вам нужно использовать какое-то сжатие. держите таблицу поиска (db или плоский файл), сопоставляя каждый тег с двухсимвольным кодом (например, aa: tag1, ab: tag2, ac: tag3 ...). придерживаясь ascii, это должно дать вам ~ 10k тегов, если этого недостаточно, используйте три символа. теперь ваше имя файла будет похоже на aa.ag.f2.gx.ty.extension

, еще один момент, на который следует обратить внимание: поскольку вы хотите искать по нескольким тегам, вы хотите убедиться, что коды тегов в вашем имени файла находятся в строгий лексический порядок. затем для одновременного поиска по тегам aa, f3 и yz выполните " ls. * aa. * f3. * yz. * ",

-1
ответ дан 18 December 2019 в 05:44
поделиться

Если вы не хотите использовать базу данных, почему бы не попробовать xml, вы можете перечислить все свои данные следующим образом:

<file>
  <md5>MD5</md5>
  <body>tag5+tag4+tag3</body>
</file>

Вы можете легко добавить больше, например заголовок и описание .

-1
ответ дан 18 December 2019 в 05:44
поделиться

Избегать SQLite, потому что он «не является родным для PHP», кажется ложной дихотомией, поскольку он компилируется почти во все практические дистрибутивы PHP. Если вы предпочитаете решение, отличное от SQL, berkeleydb предоставляет простое хранилище ключей и значений, которое можно использовать для связывания списка имен файлов с любыми заданными именами файлов тегов со списками тегов.

Но оставайтесь с решением SQL. Это будет быстро, портативно и проще, чем вы думаете.

0
ответ дан 18 December 2019 в 05:44
поделиться

Я бы вставил эту информацию в базу данных, даже если она легкая, как файл sqlite в том же каталоге.

Если вы не хотите этого делать, вы можете создать жесткие ссылки на файл без каких-либо перестановок. Один файл на тег. Пометка P: /xampplite/htdocs/tag/geoaki.png с помощью geoaki и логотипа приведет к тому, что два файла будут жесткими ссылками, указывающими на те же данные, что и исходный файл:

  • P: / xampplite / htdocs / tag / geoaki. png.geoaki)
  • P: /xampplite/htdocs/tag/geoaki.png.logo)

Это дает то преимущество, что вы можете выбрать все теги, принадлежащие этому файлу, с помощью glob () для пример.

# All tags
$tags = array();
files = glob('P:/xampplite/htdocs/tag/geoaki.png.*')
foreach ($files as $file) {
    if (fileinode($file) === fileinode('P:/xampplite/htdocs/tag/geoaki.png')) {
        $tags[] = substr($file, strlen('P:/xampplite/htdocs/tag/geoaki.png.'));
    }
}

# Check if file has tag foo:
file_exists('P:/xampplite/htdocs/tag/geoaki.png.foo')
    && fileinode(P:/xampplite/htdocs/tag/geoaki.png.foo) === fileinode('P:/xampplite/htdocs/tag/geoaki.png');

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

  • Система ломается, как только файл изменяется
  • В md5 есть коллизии, два разных файла могут иметь одинаковый хэш md5 (вероятность мала, но существует)
4
ответ дан 18 December 2019 в 05:44
поделиться

«Какой подход мне следует предпринять, чтобы обойти ограничение имени файла?»

Как насчет файловой системы, поддерживающей теги? Tagsistant Вы не указали свою операционную систему.

0
ответ дан 18 December 2019 в 05:44
поделиться

Если ваша операционная система и файловая система поддерживают расширенные атрибуты файлов, используйте их для хранения тегов. В OS X и FreeBSD см. Справочные страницы setxattr и getxattr; Linux и Solaris имеют аналогичные возможности. Windows поддерживает расширенные атрибуты NTFS. См. «Расширенные атрибуты файлов» в Википедии для получения дополнительной информации.

1
ответ дан 18 December 2019 в 05:44
поделиться

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

Я использовал подход софт-ссылок: каталог с именем .tags содержал все «теги», а теги были просто каталогами в каталоге .tags.

Если файл был помечен тегом «весело», то мягкая ссылка на него будет создана в .tags / fun .. однако этот метод не подходит для поиска по тегам.

Если вы хотите поддерживать поиск тоже рекомендую использовать sqlite.

1
ответ дан 18 December 2019 в 05:44
поделиться

Скорее мозговой штурм, чем ответ.

Как заметил @CJ, без каких-либо внешних метаданных и с ограничением 255 байтов в качестве идентификатора имени файла плюс «облако тегов» ваши tagfs остаются проблемой.

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

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

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

удачи!

2
ответ дан 18 December 2019 в 05:44
поделиться

Вы достаточно сузили вопрос, и я считаю, что ответ будет: «Нет».

Вы не нужен центральный реестр тегов, потому что он может быть поврежден.

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

Вы, вероятно, не хотите параллельный набор каталогов или каталогов со ссылками, потому что тогда он устареет при перемещении материала и, вероятно, представляет собой «мусор» в файловой системе.

Вы определенно не хотите ставить теги в содержимом самих файлов.

Итак, есть ли еще где-нибудь, где вы могли бы разместить теги помимо имени файла в структуре каталогов?

Нет. (Или, по крайней мере, нет ничего переносимого).

Конечно, негде хранить метаданные, кроме имени файла или самого файла, которые остались бы с файлом (когда он копируется и перемещается с помощью обычных инструментов), которые будет работать во всех трех основных операционных системах, о которых вы говорите (Linux, Mac, Win).

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

Я думаю, что по сравнению с большинством основных идей в операционных системах (иерархические файловые системы, интерфейсы GUI и т.д.), использование тегов является относительно новой идеей. Большинство средств, используемых всеми тремя системами, являются довольно старыми и устоявшимися идеями.

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

Может быть, кто-то написал библиотеку для Python, которая уже делает это?

CJ

3
ответ дан 18 December 2019 в 05:44
поделиться

Файловая система - это ваша база данных, поэтому используйте ее.

  1. Придумайте «уникальное имя» для вашего файла. Не имеет значения, каково имя файла, если оно уникально в пространстве. Имя файла не имеет ничего общего с тегами.

  2. Хешируйте имя файла в каталог «хранилище». Если у вас нет базиллиона файлов (<1000-2000), вы можете хранить все файлы в одном каталоге. В противном случае создайте кучу каталогов «ведра» и хешируйте файл в правильный каталог. Этот процесс, очевидно, детерминирован на основе имени файла.

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

Чтобы добавить тег к файлу, просто добавьте ссылку на файл в соответствующий каталог тегов. То же самое для удаления тега.

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

Если вы хотите сохранить фактические метаданные для файла, то создайте зеркальный каталог «метаданных». Когда вы добавляете файл, вы помещаете его в каталог хранилища файлов, а соответствующий файл метаданных - в каталог «хранилища метаданных», используя ту же схему. Удаление файла путем удаления оригинала и его метаданных.

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

Это дает вам "неограниченное" количество тегов для каждого файла, вы можете управлять им из командной строки или проводника файлов с помощью единственного необходимого инструмента - Глазное яблоко Mark I. Вы также получаете постоянные ссылки на сам файл (так как его имя никогда не меняется).

Самая мрачная часть заключается в том, что вам нужно «сканировать облако тегов», чтобы узнать, какие теги есть в файле. Если вы решите использовать файл метаданных, вы можете сохранить в нем список тегов (это усложнит ваши операции по тегированию / снятию тегов, но не сильно).

вы можете управлять им из командной строки или файлового проводника с единственным необходимым инструментом - Mark I Eyeball. Вы также получаете постоянные ссылки на сам файл (так как его имя никогда не меняется).

Самая мрачная часть заключается в том, что вам нужно «сканировать облако тегов», чтобы узнать, какие теги есть в файле. Если вы решите использовать файл метаданных, вы можете сохранить в нем список тегов (это усложнит ваши операции по тегированию / снятию тегов, но не сильно).

вы можете управлять им из командной строки или файлового проводника с единственным необходимым инструментом - Mark I Eyeball. Вы также получаете постоянные ссылки на сам файл (так как его имя никогда не меняется).

Самая мрачная часть заключается в том, что вам нужно «сканировать облако тегов», чтобы узнать, какие теги есть в файле. Если вы решите использовать файл метаданных, вы можете сохранить в нем список тегов (это усложнит ваши операции по тегированию / снятию тегов, но не сильно).

1
ответ дан 18 December 2019 в 05:44
поделиться
Другие вопросы по тегам:

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