Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 分批存储散列_Sql_Perl - Fatal编程技术网

Sql 分批存储散列

Sql 分批存储散列,sql,perl,Sql,Perl,我正在尝试使用sql作为测试来检索一组行——比如说,每次迭代中有1000行,最多一百万行,并存储在一个文件中。在我的例子中,存储文件可以是一个文本文件——为了避免内存不足问题,分批存储并不重要。我是perl脚本中的sql 如果有人能举个例子,我将不胜感激 例如: sub query{ $test = "select * from employees"; return $test; } // later in the code - my $temp; my $dataset=DBUt

我正在尝试使用sql作为测试来检索一组行——比如说,每次迭代中有1000行,最多一百万行,并存储在一个文件中。在我的例子中,存储文件可以是一个文本文件——为了避免内存不足问题,分批存储并不重要。我是perl脚本中的sql

如果有人能举个例子,我将不胜感激

例如:

sub query{

 $test = "select * from employees";
return $test;  
}

// later in the code - 

my $temp;
my $dataset=DBUtils::make_database_iterator({query=> test($temp)});
            }
     store $dataset, $result_file;
        return;

对于您提供的有限数量的信息,我所能提供的最好信息是,它使用SELECT语句的LIMIT子句从表中检索有限数量的行

显然,您必须自己为DSN、表名和store_块子程序提供实际值

use strict;
use warnings;
use autodie;

use DBI;

my $blocksize = 1000;
my ($dsn, $user, $pass) = (...);

my $dbh = DBI->connect($dsn, $user, $pass);

my $sth = $dbh->prepare('SELECT * FROM table LIMIT ? OFFSET ?') or die $DBI::errstr;
open my $fh, '>', 'test.store';

for (my $n = 0; $sth->execute($blocksize, $n * $blocksize); ++$n) {
  my $block = $sth->fetchall_arrayref;
  last unless @$block;
  store_block($block, $fh);
}

close $fh;

sub store_block {
  my ($block, $fh) = @_;
  ...
}

您说您希望分批工作以避免内存不足错误。这表明你在做这样的事情

my @all_the_rows = query_the_database($sql);
store_stuff(@all_the_rows);
您希望尽可能避免这样做,原因正是您给出的,如果数据集变大,您可能会耗尽内存

相反,您可以使用一次读取一行,一次写入一行


将行添加到存储区的操作留给您来完成。

什么是.store文件?调用sql是什么意思?可能会显示一些代码。您的问题过于简短,提供的有用信息很少。你在标题中提到的这个哈希是什么?您确定不需要另一个SQL表吗?您是在问是否必须预先分配哈希的大小吗?e、 g.密钥%yourhash=1024;键的数量总是2的幂,我不确定这会使现代机器上的东西快多少,但我想它可以帮助您保持内存使用更可预测?您使用的是Perl DBI数据库接口吗?哪个数据库驱动程序DBD模块?您使用的代码是什么?我编辑了我的问题,并放置了示例。谢谢你的帮助!你好,博罗丁,谢谢你的帮助和提供的例子。。我不想对查询设置限制,而是将1000行集合中的行的结果集打破,然后存储,然后获取下一个1000行并存储。。然后重复。我看到了我的$n=0的逻辑$sth->执行$blocksize,$n*$blocksize++$N{my$block=$sth->fetchall\u arrayref;last除非@$block;store\u block$block,$fh;这能在不设置限制的情况下完成工作吗?非常感谢您的支持help@mohitverma09:SQL语句SELECT*FROM table LIMIT n OFFSET f选择n行,忽略表中的前f行。prepare为这些参数使用占位符,并且实际值在execute调用中提供,因此程序选择$blocksize行,忽略表中的前$n*$blocksize行。然后,fetchall\u arrayref检索所选行中的所有数据。如果fetchall\u arrayref返回对空数组的引用,则指定的偏移量超出表和所有块的末尾已经被提取。这不是你想要的吗?@mohitverma09:为什么你说,我不想对查询设置限制?你的意思是什么,这会在不设置限制的情况下完成工作吗?如果你不使用limit子句,那么你可以使用fetchrow\u arrayref逐个提取所选行,但DBI将检索到我的所有行我会一次一个地把它们传给你,所以你可能仍然会有记忆问题。嘿,博罗丁,我的错..我得到了这个主意并把它应用到了我的程序中..非常感谢你的帮助..我在这一点上面临着障碍-我已经到了可以通过偏移方案将数据放入页面的地步,但现在我正在尝试附加到文件中。希望我能够解决此问题。再次感谢。
use strict;
use warnings;
use DBI;

# The file you're writing results to
my $file = '...';

# Connect to the database using DBI
my $dbh = DBI->connect(
    ...however you do that...,
    {RaiseError => 1}    # Turn on exceptions
);

# Prepare and execute the statement
my $sth = $dbh->prepare("SELECT * FROM employees");
$sth->execute;

# Get a row, write a row.
while( my $row = $sth->fetchrow_arrayref ) {
    append_row_to_storage($row, $file);
}