большой массив

Статус
В этой теме нельзя размещать новые ответы.

stalxed

Новичок
большой массив

Пишу скрипт и в нём столкнулся со следующей задачей:
есть большой txt файл(max его размер 100000строк), и нужно в конец файла добавить 10000 строчек. При том! чтобы добавляемых строк не было в файле уже!!!
Мой вариант решения этой проблемы - зафигачить всё содержимое файла в массив и каждую сроку при добавление смотреть есть ли она в массиве и если нет то записывать в конец файла и в массив! Но как интерприкатор к этому отнесётся? оперативку будет жадно ли хавать? кто сталкивался с этой проблемой? и какие ещё есть её решения?
 

stalxed

Новичок
хех еслиб я использовал в своём скрипте БД то это действительно уменьшило проблемы. Но я НЕ МОГУ использовать в поставленной задачи БД!!!
 

stalxed

Новичок
написать скрипт который бы юзал БД в моём случае это 10 мин работы, но пользователям скрипта это будет ОЧЕНЬ НЕ УДОБНО!
 

Фанат

oncle terrible
Команда форума
фигасе, какие привередливые пользователи попались.
пользователи вбуллетина, пхпББ, множества других популярных скриптов используют и не жалуются
а у тебя такие особенные, что база данных их, видите ли, не устроит.
а они вообще слышали такое слово?
 

stalxed

Новичок
Фанат понимаешь я пишу скрипт автоматизирующий работу, а не сайт, форум, портал и тд... да слышали что это такое! я конечно знаю что ты профи в php, но может не будем искать стандартных выходов? да БД создана для того чтобы с большим количеством записей быстрее справлятся, но ведь можно как-нибудь и без неё обойтись?
 

Фанат

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

какая длина строки?
 

Фанат

oncle terrible
Команда форума
вообще-то, для базы 10000 проверок - тоже многовато.
откуда эти тыщи берутся?
 

Фанат

oncle terrible
Команда форума
читай строки из файла по одной, и делай их индексами, а не значениями массива.
потом будешь сови 10 тыщ проверять по isset
 

romy4

invoke [brain]
для скорости можешь awk поюзать. советую все же использовать как можно меньше пхп здесь. в моей комманде подобная задача написана чисто на awk.

я бы тебе предложил при первом проходе сделать хэш всех строчек файла и хэш поступлений (по крайней мере бинарно использовать хеш, а не строку). например, каждый хеш 16 байт длинной получится (если использовать md5 переведенный в hex) и затем уже сравнивать. хотя нет, вторым этапом отсортировать индекс (хеш-массив). но если сгенерить хеш ещё можно средствами пхп, то сортировку все же лучше делать `cat indexfile | sort >sortedindexfile` если у вас никсы стоят - гораздо быстрее будет. а потом построчно уже сравнивать.

самая лучшая и быстрая реализация была б через БД, как уже советовали
 

stalxed

Новичок
а не всё ли равно что индексами и проверять по изсет(), что элементами и проверять по ин_эррэй()?
 

romy4

invoke [brain]
хотя смотря какая реализация сортировки. пхп-шная все-равно перебирает индексы по-порядку, там массивы связанные а не линейные. а вот для поиска индекса методом половинного деления помогла б сортировка
 

phprus

Moderator
Команда форума
st@l][ED
Дописывай просто строки в конец файла, а потом man sort. У этой утилиты есть параметр при использовании которого из файла будут удалены повторяющиеся строки.

romy4
Если уж использовать консольные утилиты, то тут ИМХО нет смысла в использовании хеша вообще.

st@l][ED
Нет не всеравно. при использовании isset ключь ищется в хештаблице. а при использовании in_array будет полный перебор массива.
 

romy4

invoke [brain]
phprus
я об этом и говорю, что в этой задаче пхп надо использовать по-минимуму.
 

stalxed

Новичок
2 phprus
твоя идея с командой sort гениальна) супер! спасиб! жаль что с юнихами давно не работал( но идея супер!

-~{}~ 18.05.07 18:23:

ребят с юнихом как я говорил давно не работал, и под рукой нету в данный момент консоли(
правильно ли я команду составил?
sort -u -o sort.txt -d \r\n file.txt
 

Фанат

oncle terrible
Команда форума
st@l][ED
а пользователи все твои будут под унихом сидеть?
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху