2017-02-21 6 views
0

Ich versuche ein Programm mit 3 Prozessen zu erstellen, die aus der gleichen Datenbank lesen. Der Code funktionierte, bevor ich Prozesse einführte.MemoryError beim Abfragen der Datenbank von Process

Ich erhalte MemoryError beim Ausführen einer select() von PeeWee, ich vermute, dass etwas mit der Freigabe von Ressourcen nicht stimmt. Minimal Beispiel:

models.py

from playhouse.pool import PooledSqliteExtDatabase 

file_scanner_database = PooledSqliteExtDatabase(
    None, 
    max_connections=32, 
) 

class FileModel(Model): 
    class Meta: 
     database = file_scanner_database 

main.py

from file_scanner import FileScanner 
from models import file_scanner_database 
from models import FileModel 
from multiprocessing import Process 

def create_scanner_agent(data): 
    scanner = FileScanner(data) 
    scanner.start_scanner() 

shared_info = {'db_location': '/absolute/path/to/database'} 

file_scanner_database.init(shared_info['db_location']) 
file_scanner_database.connect() 
file_scanner_database.create_tables([FileModel], safe=True) 

new_process = Process(
    target=create_scanner_agent, 
    args=(shared_info,) 
) 
new_process.daemon = True 
new_process.start() 

try: 
    new_process.join() 
except KeyboardInterrupt: 
    pass 

new_process.terminate() 

file_scanner.py

from models import file_scanner_database 
from models import FileModel 

class FileScanner: 
    def __init__(self, data): 
     for k, v in data.items(): 
      setattr(self, k, v) 

     file_scanner_database.init(self.db_location) 
     file_scanner_database.connect() 

    def start_scanner(self): 
     while True: 
      # THIS IS WHERE THE PROGRAM CRASHES 
      for row in FileModel.select(): 
       ... 
+0

Wenn ich stattdessen "Thread" verwende, scheint es zu funktionieren. –

Antwort

0

Es sieht so aus, als würden Sie versuchen, über eine Verzweigung auf Speicher zuzugreifen? Oder eine solche Verrücktheit? Ich denke die Antwort ist, dass du es falsch machst. Versuchen Sie, Ihre DB-Verbindung nach der Verzweigung zu öffnen.

+0

Ich versuche, auf die gleiche SQLite-Datei über die Gabel zuzugreifen, aber * nicht * mit derselben DB-Verbindung. Die erste Verbindung dient dazu, Tabellen bei Bedarf zu erstellen, und die Unterprozesse initialisieren dann ihre eigenen Verbindungen und verwenden dieselbe DB. Das Schließen der Verbindung vor dem Verzweigen macht keinen Unterschied, daher gibt es eine Ressource, die geöffnet bleibt. Ich erkannte, dass, um es zum Laufen zu bringen, ich nur Verbindungen nach der Verzweigung initialisieren sollte, aber ich verstehe nicht wirklich, warum dies notwendig ist, wenn getrennte Verbindungen verwendet werden. Der Versuch mit 'sqlalchemy' und' sqlite3' zeigt, dass dies wahrscheinlich tiefer geht als pw. –

Verwandte Themen