Anonymous
Ну можно там shm_* и pack для сериализации использовать. Но я бы не решал её вообще чисто силами PHP. Могу рекомендовать redis. Конечно, оверхед будет большой. Но очень много строк в списке из которого нужно вытащить какие-то неповторяющиеся случайные значения — почти типовая задача для него.
Anonymous
И гарантируется атомарность.
Dmitriy
The Ant
Vitaly
The Ant
тока после ансета по выбранным индексам не забудь запустить сборщик мусара
Vitaly
Собственно, простое решение найдено. А вот теперь задача усложняется. Считаем, со работаем многопоточно, и соответственно не можем даже временно менять исходный массив, должен быть shared
Anonymous
Я видимо не улавливаю совсем о чем речь.
Vitaly
Vitaly
И просто перебрасывать указатели
Anonymous
Вы собираетесь в PHP "память" загрузить массив, который занимает почти всю оперативную память?
Vitaly
Правда тогда выбор будем медленнее чем у хэша
Anonymous
Просто если "простое решение" вам подходит, то чем тогда не подходит вариант
$a = [ 1, 2, 3, ..., 1000000000 ];
$a[ rand( 0, count( $a ) - 1 ) ]
Anonymous
И причем тут многопоточность, php однопоточный язык, в нем рекурентные данные могут находиться только во внешнем хранилище.
Anonymous
А в других языках исключительный доступ управляется семафорами или менеджером тредов.
The Ant
тока хотел написать )
The Ant
Считаем, со работаем многопоточно и берем другой язык
Anonymous
Чтобы массив/объект не был мутабелен в случае этой задачи достаточно просто выбирать числовой индекс (или смещение) и читать его. Каждый индекс сохранять, чтобы избежать повторяющихся значений.
Anonymous
Потому что не придется удалять или записывать что-то в такой массив.
Vitaly
The Ant
взять редис там чота такое есть https://redis.io/commands/srandmember
The Ant
не юзал, но вдруг )
Anonymous
Vitaly
Dmitriy
Vitaly
Anonymous
Для того, что написано в цитате.
The Ant
чот орнул. в условиях ограниченной оперативной памяти использовать пых. чоткие ребята ;D
Dmitriy
а хотя нет
Anonymous
Хотя, может быть я просто не так прочел.
Anonymous
Я не понял, что там куда слить, что за новый массив и старый.
Dmitriy
Dmitriy
и там перемешай для большей рандомизации
Anonymous
Зачем убирать из исходного объясните.
Dmitriy
The Ant
мы на канале пыха, стало быть привязана
Dmitriy
окей зануда
Dmitriy
когда тут жс обсуждают все норм всем
The Ant
ну если не привязана, тогда пусть на пряму с памятью работает в сях
Vitaly
)))
Dmitriy
тут больше придумать сам алгоритм а не реализацию
Vitaly
Задача к языку не привязана
Vitaly
Dmitriy
Vitaly
Пока есть только первые наметки. Для однопоточного исполнения
Anonymous
Если рассматривать любой почти язык с управляемой памятью, типа php, то в них любые данные будут скопированы по факту только на операции записи.
Vitaly
Anonymous
Это называется copy on write.
Vitaly
Кстати да
Vitaly
По остатку от деления например
Anonymous
Поэтому $a = [ 1, 2, 3 ]; $b = $a[ 0 ]; Не скопирует 1. Правда вы получите все равно расход памяти под новый массив гораздо больший, чем предполагаете в этом примере. Эту задачу определенно нужно решать без мутирования исходных данных. Особенно на таком языке, как php. Если речь про другие языки, то векторы (индексированные массивы) хранятся гораздо эффективнее, чем хеши, при фиксированной длинне значения. Поскольку, собственно, не хранят адресную таблицу для каждого значения, а только начало массива, длинну значения и количество значений. А в php вообще, если не путаю, хеш в куче хранится, там при заполнении данных "очень большим количеством значений" операции даже отображения такого массива в память будут медленные, поскольку необходимо будет производить поиск свободного места в heap.
Vitaly
Эмм...
The Ant
а многопоточность то зачем нужна?
Vitaly
The Ant
и что она будет делать, эта многопоточность? )
The Ant
типа новый клиент новый поток?
Dmitriy
Поэтому $a = [ 1, 2, 3 ]; $b = $a[ 0 ]; Не скопирует 1. Правда вы получите все равно расход памяти под новый массив гораздо больший, чем предполагаете в этом примере. Эту задачу определенно нужно решать без мутирования исходных данных. Особенно на таком языке, как php. Если речь про другие языки, то векторы (индексированные массивы) хранятся гораздо эффективнее, чем хеши, при фиксированной длинне значения. Поскольку, собственно, не хранят адресную таблицу для каждого значения, а только начало массива, длинну значения и количество значений. А в php вообще, если не путаю, хеш в куче хранится, там при заполнении данных "очень большим количеством значений" операции даже отображения такого массива в память будут медленные, поскольку необходимо будет производить поиск свободного места в heap.
раз такая логика.
Представь что эти данные на любом языке занимают почти всю память. создание нового "массива" из больше 100 значений не возможно на любом языке .. мы упремся в память...
Vitaly
Да
The Ant
хранилище твоих айдишников все равно будет одно
The Ant
толку от этих многопотоков?
Vitaly
Shared memory
The Ant
тем более если всем хочешь раздавать уникальные айдишники, то операции изъятия из пула должны быть атомарны
Vitaly
Всем спасибо, особенно Дмитрию. Пойду ужинать
The Ant
карочи тут редис с его рандом мембер и последующим удалением из списка :)
Anonymous
Я уже молчу про то, что unset( $a[ $index ] ); вообще никакой полезной операции не выполнит в PHP.
The Ant
The Ant
Anonymous
Да не будет сборщик дефрагментировать память же.
The Ant
но освободит немного )
Dmitriy
Anonymous
В общем, я неправильно сказал.
Anonymous
Удалять значения можно для того, чтобы что-то вроде array_rand выдало ключ, который уже не встречался.