Настольный курсор в Perl - PullRequest
0 голосов
/ 14 февраля 2012

Я хочу перебрать большую таблицу, которая не помещается в памяти.

В Java я могу использовать курсор и загружать содержимое по мере необходимости и не переполнять память.Как мне сделать то же самое с Perl?

Я использую базу данных PostgreSQL и DBI.

Ответы [ 4 ]

3 голосов
/ 14 февраля 2012

Я использовал курсор PostgreSQL из базы данных PostgreSQL.

my $sql = "SOME QUERY HERE";
$dbh->do("DECLARE csr CURSOR WITH HOLD FOR $sql");
my $sth = $dbh->prepare("fetch 100 from csr");
$sth->execute;

while(my $ref = $sth->fetchrow_hashref()) {     
    //... - processing here
    if ($count % 100 == 0){             
        $sth->execute;
    }
}
3 голосов
/ 14 февраля 2012

Просто используйте курсор базы данных в PostgreSQL. Пример из руководства :

BEGIN WORK;

-- Set up a cursor:
DECLARE liahona SCROLL CURSOR FOR SELECT * FROM films;

-- Fetch the first 5 rows in the cursor liahona:
FETCH FORWARD 5 FROM liahona;

 code  |          title          | did | date_prod  |   kind   |  len
-------+-------------------------+-----+------------+----------+-------
 BL101 | The Third Man           | 101 | 1949-12-23 | Drama    | 01:44
 BL102 | The African Queen       | 101 | 1951-08-11 | Romantic | 01:43
 JL201 | Une Femme est une Femme | 102 | 1961-03-12 | Romantic | 01:25
 P_301 | Vertigo                 | 103 | 1958-11-14 | Action   | 02:08
 P_302 | Becket                  | 103 | 1964-02-03 | Drama    | 02:28

-- Fetch the previous row:
FETCH PRIOR FROM liahona;

 code  |  title  | did | date_prod  |  kind  |  len
-------+---------+-----+------------+--------+-------
 P_301 | Vertigo | 103 | 1958-11-14 | Action | 02:08

-- Close the cursor and end the transaction:
CLOSE liahona;
COMMIT WORK;
1 голос
/ 14 февраля 2012

Что не так с:

my $s = $h->prepare(select ...);
$s->execute;
while(my $row = $fetchrow_arrayref) {
  ; # do something
}
0 голосов
/ 14 февраля 2012

Посмотрите на DBD :: Pg docs для примера.

Используйте функции DBI fetchrow_ * в цикле while () для меньшего выделения памяти, избегайте fetchall _ *.

Другие параметры базы данных, связанные с использованием памяти:

  • LongReadLen - максимальная длина полей типа long (LONG, BLOB, CLOB, MEMO и т. Д.)
  • RowCacheSize (не используется в DBD :: Pg) - подсказка драйверу, указывающая размер локального кэша строк, который приложение хотело бы использовать драйвером для будущих операторов "SELECT".
...