Bonjour à tous,
J'ai crée une base de données de type INNODB. Je dois y charger de très grandes séquences d'ADN. J'utilise comme type de colonne LONGTEXT car j'ai vu que sa taille peut aller jusqu'à 2^23 (8.388.608) caractères. Malgrè cela, je n'arrive pas à y charger une séquence de 5.000.000 caractères.
Mon script PERL interroge un site internet afin d'y prendre les informations, met le tout dans un tableau indexé ($Table). Ensuite, PERL crée une DB MySQL et y charge les informations en faisant une boucle sur le tableau. Cela fonctionne très bien avec des séquences de petite taille (180.000).
J'arrive a charger jusqu'à 1.000.000 caractères, mais pas plus. Peut-être devrais-je vider la mémoire SQL. J'aimerais également savoir à quoi cela sert il de mettre un "$sth3->finish;", est-ce utile dans mon cas?
Je commence par créer une table:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 my($sql) = "CREATE TABLE $Table (Acc VARCHAR(20) PRIMARY KEY, Type VARCHAR(10), Gi VARCHAR(20), Souche VARCHAR(50), Isolat VARCHAR(50),Taxon VARCHAR(50), Description TEXT, Origine VARCHAR(50), Note TEXT, Sequence LONGTEXT) ENGINE = InnoDB;"; my($sth) = $DBconnect->prepare($sql) or print "prepare error\n"; $sth->execute or die "Could not execute SQL statement ... maybe invalid?";
Ensuite,j'y charge les entrées une à une en utilsant une boucle lisant mon tableau indexé (contenant les informations) ligne par ligne. Je fais cela en deux temps, j'insers toutes mes clés primaires ($Acc) puis ensuite les autres champs.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 foreach my $Acc (keys %$Ref) { my($sql2) = "INSERT INTO $Table(Acc) values ('$Acc');"; my($sth2) = $DBconnect->prepare($sql2) or print "prepare error\n"; $sth2->execute or die "Could not execute SQL2 statement ... maybe invalid?"; my $Hash=$Ref->{$Acc}; foreach my $Champ (keys %$Hash) { my $Valeur = $Ref->{$Acc}->{$Champ}; if (($Champ eq "Sequence") & (length $Valeur > 2**23)) { $Valeur="<html><a href=\"http://www.ncbi.nlm.nih.gov/entrez/viewer.fcgi?db=nucleotide&val=$Acc\">Sequence (Lien GenBank)<\/a><\/html>"; } my($sql3) = "UPDATE $Table SET $Champ = '$Valeur' WHERE Acc like '$Acc';"; my($sth3) = $DBconnect->prepare($sql3) or print "prepare error\n"; $sth3->execute or die "Could not execute SQL2 statement ... maybe invalid?"; $sth3->finish; }
En cas où ma séquence dépasse 2^23, j'aimerais mettre dans ma DB un lien vers le fichier internet contenant cette séquence. Je ne sais pas quelle balise ou quel code écrire dans mon script PERL. Avec ce qui est écrit plus haut, dans ma DB est noté
Code : Sélectionner tout - Visualiser dans une fenêtre à part <html><a href="http://www.ncbi.nlm.nih.gov/entrez/viewer.fcgi?db=nucleotide&val=NC_005945">Sequence (Lien GenBank)</a></html>
J'utilise Active Perl 5.8.3 et EasyPHP 1.8. (= MySQL 4.1.9)
Merci beaucoup,
Jasmine,
Partager