私は perl で簡単なことをしようとしていますが、それを行うのに苦労しています。mysql からデータを読み取り、データに対して何かを実行してから、何かを出力する必要があります。問題は、データベース ファイルのサイズが 90MB しかなく、システムのメモリが 4GB であることです。誰かがこの問題について私を助けてくれますか? つまり、それはなぜですか?
これが私のコードです:
#!/usr/bin/env perl
use common::sense;
use File::Slurp;
use Text::SpeedyFx;
use DBI;
use DBD::mysql;
my $dbh = DBI->connect('dbi:mysql:enron','x','y') or die "Connection Error: $DBI::errstr\n";
# Create cascades
my $sql = "select uniqueid,mid,sender,receiver,unixdate,body,seen from filteredmessage";
my $sth = $dbh->prepare($sql);
$sth->execute or die "SQL Error: $DBI::errstr\n";
# Variables
my $row;
my $uniqueId;
my $msg1;
my $sender;
my $receiver;
my $unixdate;
my $uniqueId2;
my $msg2;
my $sender2;
my $receiver2;
my $unixdate2;
my $dif;
my $row2;
my $sql2;
my $sth2;
my $j;
my $i=1;
while ($row = $sth->fetchrow_hashref) {
my $flagSingleRow = 0;
$uniqueId = $row->{'uniqueid'};
$msg1 = $row->{'body'};
$sender = $row->{'sender'};
$receiver = $row->{'receiver'};
$unixdate = $row->{'unixdate'};
$sql2 = "select uniqueid,mid,sender,receiver,unixdate,body,seen from filteredmessage";
$sth2 = $dbh->prepare($sql2);
$sth2->execute or die "SQL Error: $DBI::errstr\n";
$j=1;
while ($row2 = $sth2->fetchrow_hashref) {
$uniqueId2 = $row2->{'uniqueid'};
$msg2 = $row2->{'body'};
$sender2 = $row2->{'sender'};
$receiver2 = $row2->{'receiver'};
$unixdate2 = $row2->{'unixdate'};
$dif = cosine_similarity($sfx->hash_fv($msg1, 8192),$sfx->hash_fv($msg2, 8192));
#if($dif>0.5){
print $i." ".$j." ". $dif."\n";
#}
$j++;
}
$i++;
}
sub cosine_similarity {
my ($a, $b) = @_;
my $nbits_a = unpack(q(%32b*) => $a);
my $nbits_b = unpack(q(%32b*) => $b);
return $nbits_a * $nbits_b
? unpack(q(%32b*) => $a & $b) / sqrt $nbits_a * $nbits_b
: 0;
}