2017-02-21 35 views
0

我正在嘗試創建一個程序,其中包含從同一個數據庫讀取的3個進程。在我開始介紹流程之前,代碼正在工作。從進程查詢數據庫時的MemoryError

從PeeWee執行select()時,我收到MemoryError,我懷疑共享資源有問題。小例子:

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

如果我使用'線程',而不是它似乎工作。 –

回答

0

它看起來像你試圖通過叉子訪問內存?還是有些瘋狂?我想答案是,你做錯了親密的事。嘗試在分叉之後打開數據庫連接。

+0

我試圖通過fork訪問相同的Sqlite文件,但*不*使用相同的數據庫連接。第一個連接用於在需要時創建表,然後子流程初始化它們自己的連接並使用相同的數據庫。分叉之前關閉連接沒有任何區別,所以有一些資源保持打開狀態。我意識到要使它工作,我應該只在分叉後初始化連接,但我不明白爲什麼使用單獨的連接時這是必需的。嘗試'sqlalchemy'和'sqlite3'表明這可能比pw更深入。 –