9
votes

PHP / SQLITE - Copier une table du disque à la mémoire

J'ai une base de données SQLite3 sur mon HardDrive (fichier.db) avec 5 tables. J'aimerais copier 3 de ces tables dans une base de données en mémoire (: mémoire :).

Y a-t-il un moyen simple de le faire en utilisant le format PDO de PHP5?


1 commentaires

J'essaie également de le faire pour mes tests d'unité. Le fichier SQLite DB aura toutes les données de test. Mais je ne veux pas que les tests changent ceci afin que je souhaite copier la DB dans: Mémoire: avant d'exécuter les tests dessus. Il suffit de donner une raison que quelqu'un pourrait vouloir faire cela.


6 Réponses :


12
votes

Pas une solution spécifique en PDO qui peut être suffisante ou non dans votre cas:

  • Créer un: Mémoire: Database LI>
  • Joindre le fichier de base de données existant li>
  • créer une table ... comme sélectionnez * à partir de ... li>
  • détacher le fichier de base de données li> ul>

    EDIT: un exemple de
    Premier un exemple de base de données stocké dans mydb.sq3 p> xxx pré>

    Nous avons maintenant une base de données: mémoire: la base de données et souhaitez transférer la table FOO P>

    CREATE TABLE bar(x INT,y,z)
    


1 commentaires

Ouais, j'ai trouvé cela en ligne mais je ne pouvais pas trouver un moyen de le faire avec PHP-PDO.



4
votes

Si c'est ce que vous devez faire, alors la réponse de Volkerk est celle que je fournis, mais je pense que je dois souligner que vous allez lire le contenu de ces tables en mémoire chaque fois que vous courez cela. Code (chaque fois que cette page se charge?), il peut donc être préférable d'interroger les fichiers de données à partir du disque.


1 commentaires

Pour les tests, cela peut vraiment avoir un sens car la suite peut rester en mémoire à tous les tests.



1
votes

Notez que l'on pourrait toujours utiliser une sorte de mécanisme de mémoire partagé (E.G. APC, MEMCACHE, etc.) pour empêcher les bases de données en mémoire de SQLite persistantes entre les connexions.


1 commentaires

Pourriez-vous s'il vous plaît expliquer comment faire ici - Stackoverflow.com/Questtions/9104698/... ?



0
votes

Vous pouvez jeter la base de données à la fin de la connexion, enregistrez-la sous la variable APC, puis chargez-la et exécutée à nouveau à partir de APC au début de la prochaine exécution.


0 commentaires

0
votes

L'utilisation de la méthode décrite par Volkerk a rapidement doublé les performances de mon code lors de l'utilisation d'une base de données SQLite ~ 150 Mo.

Chargement de la base de données dans une DB SQLite in-Memory n'a pas nécessité d'autres modifications à mon code existant.

Mon cas d'utilisation était des données de traitement par lots afin que je n'ai pas eu à gérer les problèmes. WEZ Furlong Faits saillants.

Lecture des données en mémoire était étonnamment rapide. L'ensemble de 150 Mo a été chargé en mémoire de SSD en moins de deux secondes. Il semblait trop beau pour être vrai pour que j'ai vérifié et revérifié les données.

Merci beaucoup à Volkerk pour une solution magique!

J'ai également constaté que lorsque j'ai également indiqué les tables en mémoire mes requêtes sont exécutées trois fois plus rapidement xxx


0 commentaires

0
votes

Si vous avez besoin d'une petite base de données pour tests, vous pouvez exporter votre base de données vers un fichier SQL, puis l'exécuter comme une seule requête dans PHP:

class EphemeralPDO extends \PDO {
  public function __construct() {
    parent::__construct('sqlite::memory:', null, null, [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);
    $queries = file_get_contents(__DIR__ . '/database.export.sql');
    $this->exec($queries);
  }
}


0 commentaires