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