Бинарный файл PHP

12 3
lutskboy
На сайте с 22.11.2013
Offline
173
330

Привет

подскажите как в PHP использовать функции puck и unpuck чтоб упаковать данные

например

12|ivan
32|vova
45|serg

или массив

$data= [
  12 => 'ivan',
  14 => 'vova',
]

чтоб потом можно их было быстро оттуда достать по числу 12 32 45. типа как id в базе данных

то что можно использовать бд mysql sqlite я знаю. мне нужно этот вариант.

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

нашел примеры в сети. но там только как упаковать. а как по id достать нету. может кто знает как ето в базах данных сделано

$data = array(
    array( 5, 'Ivan' ),
    array( 9, 'Vova' ),
    array( 12, 'Sergio' ),
);


$result = '';
foreach ( $data as $person )
{
    list( $id, $name ) = $person;
    $result   .= pack( 'c2a*', $id, strlen($name), $name );
}


file_put_contents( __DIR__ . '/person.bin', $result, FILE_BINARY ); 

$handle = fopen(__DIR__ . '/person.bin', "rb");
$persons = array();
while ( ! feof( $handle ) )
{
    $data   = fread( $handle, 2 );
    if ( strlen($data) == 2 )
    {
        $int    = unpack( 'cid/ccount', $data );
        $name   = unpack( 'a*', fread( $handle, $int['count'] ) );
        $persons[] = array( $int['id'], $name );
    }


}
fclose($handle);

print_r($persons);


Ilya74
На сайте с 12.06.2008
Offline
354
#1
 
lutskboy :
нашел примеры в сети. но там только как упаковать. а как по id достать нету. может кто знает как ето в базах данных сделано

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

И зачем вам так сложно? В json сохраняйте и всё.

⚡️ Хостинг и VPS в Москве, Новосибирске, Нидерландах, США ( https://x5x.host )
lutskboy
На сайте с 22.11.2013
Offline
173
#2
Ilya74 #:
 

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

И зачем вам так сложно? В json сохраняйте и всё.

json нет. файл будет 50-100мб. нужно именно искать в бинарном файле. 

C
На сайте с 22.08.2012
Offline
104
#3
lutskboy #:

json нет. файл будет 50-100мб. нужно именно искать в бинарном файле. 

    if ( strlen($data) == 2 )
    {
        $int    = unpack( 'cid/ccount', $data );
        $name   = unpack( 'a*', fread( $handle, $int['count'] ) );
        $persons[] = array( $int['id'], $name );
    }

Это и есть ваш поиск,  просто добавьте в него 

if ($int['id'] == SEARCH_ID ) {...}

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

lutskboy
На сайте с 22.11.2013
Offline
173
#4
chaturanga #:

Это и есть ваш поиск,  просто добавьте в него 

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

там будет около 3млн записей. не годится так. перебирать все

Ilya74
На сайте с 12.06.2008
Offline
354
#5
lutskboy #:

там будет около 3млн записей. не годится так. перебирать все

Для таких целей БД используют, а не бредовые методы придумывают. Уже давно всё за вас изобрели.

lutskboy #:
json нет. файл будет 50-100мб. нужно именно искать в бинарном файле. 

И что? Чем размер файла в 50 мегабайт мешает хранить данные в json?

lutskboy
На сайте с 22.11.2013
Offline
173
#6
Ilya74 #:

Для таких целей БД используют, а не бредовые методы придумывают. Уже давно всё за вас изобрели.

И что? Чем размер файла в 50 мегабайт мешает хранить данные в json?

php память так забьется

C
На сайте с 22.08.2012
Offline
104
#7
lutskboy #:

php память так забьется

JSON в вашем случае вполне приемлемый вариант. Просто вы не умеете его готовить. Вкусный рецепт здесь.

W1
На сайте с 22.01.2021
Offline
289
#8
lutskboy #:
php память так забьется

А вашими распакованными данными не забьётся?

Мой форум - https://webinfo.guru –Там я всегда на связи
K
На сайте с 16.01.2022
Offline
20
#9

могу предложить такой велосипед:

1. если id это int, то записать данные в строку, где номер строки это id, читать строку из файла

2. записать данные в memcached (это если не использовать mysql) и дергать их оттуда, но каждый раз после запуска системы нужно данные постоянно записывать в memcahed

3. про json уже говорили

K
На сайте с 16.01.2022
Offline
20
#10
нужно именно искать в бинарном файле. 

искать занимает много системных ресурсов

12 3

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