include в php большого файла

C
На сайте с 22.08.2012
Offline
104
#21
Sly32 #:

Мне кажется, ты счас описал NoSQL))) Ну примерно.

Ну там всё сложнее, тот же редис использует разные способы индексации, в некоторых случаях и классический B-Tree

Sly32 #:

Но правильно я понял - хэши имен файлов нужно где-то хранить? 

Нет,  хеши вычисляются в момент обращения (чтения/записи)

Sly32
На сайте с 29.03.2012
Offline
303
#22
chaturanga #:
Нет,  хеши вычисляются в момент обращения (чтения/записи)

Тогда я не понимаю как это будет работать.
вот есть на диске условно 10 файлов. 1.txt, 2.txt, 3.txt ... мне нужно обратиться системными средствами к нужному каталогу, вычитать все имена файлов в нем - это уже IO операция.  Потом для каждого  имени получить  MD и уже на его основе построить дерево? 

Aisamiery
На сайте с 12.04.2015
Offline
293
#23

Зачем вы пытаетесь изобрести SQLite? это и так 1 файл и гуляет вместе с проектом.

Но на самом деле, если у ТС небольшой файл, например меньше 10Мб (а это очень много ID, но размер можно подобрать в целом, лучше чтоб он был в размер opcache конфига для файлов, тогда он вообще уже байт кодом ляжет), то наверное лучше было бы его создавать как

<?php

return [
// тут список ID через , например через функцию implode
];

А в вызывающем коде сделать что то типа:

$array = include("path/to/file.php");
$array = array_flip($array);

// проверяем
if (isset($array[$videoId])) {
    // есть в массиве
}
Разработка проектов на Symfony, Laravel, 1C-Bitrix, UMI.CMS, OctoberCMS
C
На сайте с 22.08.2012
Offline
104
#24
Sly32 #:

вычитать все имена файлов в нем - это уже IO операция.  Потом для каждого  имени получить  MD и уже на его основе построить дерево? 

не ВСЕ имена. В одном файле - одно значение. По сути, если значение не нужно (а нужны только ключи), то файл может быть пустым и даже не быть вообще - финальным будет также каталог

Sly32 #:

вот есть на диске условно 10 файлов. 1.txt, 2.txt, 3.txt ... мне нужно обратиться системными средствами к нужному каталогу

У нас есть 2 задачи:

1) внести имя файла в список
2) узнать, есть ли такое имя файла в списке

в обоих случаях мы вычисляем хеш файла (пусть md5, хотя это не лучший вариант)

MD5 (1.txt) = dd7ec931179c4dcb6a8ffb8b8786d20b
MD5 (2.txt) = c3d57eb88086a04b1e04d06a9b6188e5
MD5 (3.txt) = 3d70dca5cadfff6563d95a05a0b2a0f3
MD5 (10.txt) = ecd44780e3d8ebde70851f940606bc7e

то есть файлы лягут в каталоги, и если нам нужен только хеш, то даже файла создавать не будем

$ mkdir -p "./dd/7e/c9/31/17/9c/4d/cb/6a/8f/fb/8b/87/86/d2/0b"
1.txt:
dd
  7e
    c9
      ...
        0b
2.txt:
c3
  d5
    7e
      ...
        e5
3.txt:
3d
  70
    dc
      ...
        f3
10.txt:
ec
  d4
    47
      ...
        7e

2) узнать, есть ли такое имя файла в списке (опять же вычисляем хеш и проверям есть ли такой каталог)

$ ls -1 "./dd/7e/c9/31/17/9c/4d/cb/6a/8f/fb/8b/87/86/d2/0b" && echo "exists"
exists

$ ls -1 "./dd/7e/c9/31/17/9c/4d/cb/6a/8f/fb/8b/87/86/d2/AA" || echo "not exists" ls: ./dd/7e/c9/31/17/9c/4d/cb/6a/8f/fb/8b/87/86/d2/AA: No such file or directory not exists
Самое сложное для конкретной задачи подобрать быструю и надёжную хеш-функцию. Например для вычисления 2-х координат мы можем использовать функцию Кантора - универсально и вроде неплохо, но если мы знаем точный размер карты (пусть10x10), то можем написать её намного проще а-ля hash = x*10+y и получим огромный прирост скорости.
C
На сайте с 22.08.2012
Offline
104
#25
Aisamiery #:

Зачем вы пытаетесь изобрести SQLite?

Так пятница же :)

Aisamiery
На сайте с 12.04.2015
Offline
293
#26
chaturanga #:
mkdir -p "./dd/7e/c9/31/17/9c/4d/cb/6a/8f/fb/8b/87/86/d2/0b"

Не боитесь что у вас inode закончатся в системе?

Sly32
На сайте с 29.03.2012
Offline
303
#27
chaturanga #:
узнать, есть ли такое имя файла в списке (опять же вычисляем хеш и проверям есть ли такой каталог)

То есть правильно я понял - имя файла соответствует искомому айдишнику? Если я хочу проверить  например айди 12345, я вычисляю  хэш от него и пытаюсь на диске найти файл с соответствующим именем(хэшем)? А как формируется дерево? Или оно не нужно? Я думал так:

 /base/
        10000
                10001
                10002
        20000
                20001
                20001
...

        

если мне прилетает айди 10010 -  я его ищу в каталоге 10000
если 22000 - ищу в каталоге 20000
и так далее,
Или все файлы в одном каталоге?

C
На сайте с 22.08.2012
Offline
104
#28
Aisamiery #:

Не боитесь что у вас inode закончатся в системе?

неа, я осознаю с чем работаю и (по-прежнему) больше боюсь кривой хеш-функции

C
На сайте с 22.08.2012
Offline
104
#29
Sly32 #:

То есть правильно я понял - имя файла соответствует искомому айдишнику? Если я хочу проверить  например айди 12345

что в вашей задаче ключ, и что его значение?
в предложенном решении  файл - ключ, содержимое  - значение

htexture
На сайте с 29.05.2017
Offline
194
#30
NoMoreContent #:
СУБД - хорошая штука. Они придуманы не зря. Только ну очень долго разворачиваются из бэкапа

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

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

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий