Xpoint
   [напомнить пароль]

Out of memory!

Метки: [без меток]
2007-03-25 19:25:05 [обр] Spider[досье]
Замучила ошибка Out of memory! Подскажите, как ее локализовать. Программа написана на Perl, суть - гостевая книга, в принципе почти полноценный сайт. Активно использую DB_File, и собственные модули. При этом на некоторых хостах все проходит без ошибок, а на некоторых просто беда, хостер жалуется, что я ему сервер кладу.
Дома работаю в Win-XT, Apach, Perl. MySQL не использую.
Несколькими темами ниже этот вопрос затрагивался, поэтому и нашел этот форум в поисковике.
спустя 2 часа 52 минуты [обр] wiktar(0/20)[досье]

Я думаю, что некоторые хостеры не ставят ограничения, а некоторые ставят - по используемому процессом ОЗУ.

Задайте вопрос хостеру.

В любом случае: постарайтесь использовать в скрипте меньше памяти.

спустя 1 час 35 минут [обр] Spider[досье]
В том то и проблема, что память КУДА-ТО УТЕКАЕТ, и я не могу найти куда. Поэтому и прошу помощи - помогите найти куда утекает память, где происходит эта утечка, как это проконтролировать. Я даже разработал специальную подпрограммку, которая ПРОВЕРЯЕТ используемые мною ресурсы, типа сколько строк считал, да сколько они занимают байтов, сколько времени уходит на обработку, но утечка происходит помимо этого. Подозреваю, что это происходит при использовании каких-то системных ресурсов, типа обратился к какому-то модулю, ва в нем некая переменная не описана и т.п.
спустя 10 часов [обр] wiktar(0/20)[досье]

А вот, гляньте: Обнаружение и устранение утечек памяти в Perl программах .

Может быть, DB_File грузит всё содержимое базы в память? Маловероятно, но всё-же. Может быть, у вас алгоритм такой, что читает всё в память...

спустя 1 час 16 минут [обр] Spider[досье]
Нет, это очень даже НЕ маловероятно! Дело в том, что DB-хэш хранится на диске неотсортированным, и если используешь такую к примеру конструкцию -
foreach $el (sort keys %DBfile){}, то действительно весь DBfile загружается в память и смысл теряется. Я через это уже прошел и теперь все DB-хэши создаю с помощью переменной DB_BTREE:
$DB_BTREE->{'compare'} = sub{my ($key1, $key2) = @_ ;"\L$key2" cmp "\L$key1" }; # Обратная сортировка
tie(%DB,"DB_File",$dbFile,O_RDWR|O_CREAT, 0666, $DB_BTREE)
Сейчас освоил дебугер в PerlBuilder и тестирую программу при помощи него, но думаю это не поможет.
Статейку посмотрел, сложновато, но если ничего не проклюнется, придется заняться этими модулями. У хостера наверняка их нет, так что как-то надо изощряться, сначала достать, а потом устанавливать. Ох-хо-хо! Тяжела ты жизнь
спустя 1 час 12 минут [обр] wiktar(0/20)[досье]

Spider[досье], как это — отсортированный хэш?

Действительно, если вы загрузите всю базу в память — она исчерпается. Какие тут могут быть глюки?

Может быть, пересмотрите алгоритмы? Или сам принцип хранения-обработки вашей информации.

Чем не подходит просто хранить во flat-текстовом файле? Да, впрочем, мне трудно судить, скрипт ведь ваш.

спустя 2 часа 4 минуты [обр] Сергей Пантелеев(0/15)[досье]
Точно найти место, где кончается память, можно довольно легко. Во-первых, можно делать печать в лог до и после места, где скрипт предположительно вылетает. Проблема проявляется регулярно? Значит, поймаете. Во-вторых, под линуксом без установки дополнительных модулей можно почерпнуть немного информации о памяти, занимаемой текущим процессом, если почитать файл /proc/$$/status (где $$ - переменная, в которой лежит номер процесса). Опять же - посмотрели память до подозрительной операции, посмотрели после, сравнили, сделали выводы.
А вообще, если Вам приходится хранить в хешах то отсортированные данные - это повод задуматься о правильности выбора их структуры, wiktar[досье] прав.
спустя 4 дня [обр] Spider[досье]
Пока что я решил проблему таким образом: жестко причесал все модули, весь алгоритм при помощи прагмы use strict . Где происходила утечка так и не нашел, но теперь error-лог чистенький, как младенец.
Что касается DB-файлов, то я их использую (в альтернативу MySQL) потому, что это стандартный, штатный модуль Perl и юзеру, который ставит прогу на свой сервер не нужно дополнительных просьб о подключении MySQL и т.п.
В хэш-файлах я храню аккаунты посетителей, их регистрацию и т.п., кроме того, реестр сообщений также хранится в хэш-файлах. В браузер его нужно выводить отсортированным по времени, следовательно и хранить на диске его нужно уже отсортированным. А это можно только при использовании DB_BTREE.
Powered by POEM™ Engine Copyright © 2002-2005