2014-02-28 59 views
4

我從Oracle數據庫使用cx_oracle拉出大數據使用下面的示例腳本:內存管理

from cx_Oracle import connect 

TABLEDATA = [] 

con = connect("user/[email protected]") 
curs = con.cursor() 
curs.execute("select * from TABLE where rownum < 100000") 

for row in curs: 
    TABLEDATA.append([str(col) for col in list(row)]) 

curs.close()       
con.close() 

問題,在列表存儲的是,它結束了約800-900萬桶的RAM使用。 我知道我可以改爲將其保存在文件中,而不是保存在列表中,但我使用此列表使用QTABLEVIEW和QABSTRACTTABLE MODEL來顯示錶格。

是否有任何替代或更有效的方式,我可以最大限度地減少存儲器使用這些數據並使用它來顯示我的表?

回答

1

我已經嘗試了多種possobilities,我不認爲qsqltablemodel適合我。雖然它直接從數據庫加載數據,但當您向下滾動時,它會在表中加載越來越多的數據,因此內存使用量不斷增加。

我認爲理想的工作是能夠在模型中加載設定的行數。當你向下滾動時,它會加載新行,但同時也會卸載已經存在的內容。因此,在任何時間點,我們只有設定的行數加載模型。

0

如果你不想將所有的數據存儲在RAM中,那麼你需要爲你使用一個模型tableview,根據需要從數據庫中獲取信息。幸運的是,Qt本身支持這一點,並且可以連接到oracle數據庫。

你會想看看:

注意這是C++的文檔,但它是很容易轉化爲PyQt(我總是使用C++文檔d儘管從來沒有在C++編碼)。您可能還想劃分QSqlTableModel以提供與標準接口略有不同的行爲!

+0

很久以前我第一次嘗試使用QOCI連接,但它不適用於我。我所有的就是dsn,使用,傳遞數據庫。 cx_Oracle easilu使用connect(「user/pass @ dsn」)進行連接。事實上,這些信息將由用戶輸入來設置數據庫連接。我從來沒有能夠使它工作,這就是爲什麼我必須首先切換到QAbstractTableModel的原因。 –

+0

我會嘗試重新審視它,看看你是否可以使它工作。重新實現行爲不會很有趣!你見過這個嗎?從http://qt-project.org/doc/qt-4.8/qsqldatabase.html#setDatabaseName:「對於QOCI(Oracle)驅動程序,數據庫名稱是TNS服務名稱。」儘管閱讀http://www.qtcentre.org/threads/42918-QOCI-plugin-with-Oracle-RAC表明如果配置正確,您可以使用DSN名稱。我不太瞭解Oracle數據庫,對不起。 –

+0

如果你想重新實現標準qt類的行爲,但是使用cx_oracle,要麼是子類'QAbstractTableModel',要麼重新實現'QSqlQueryModel'的方法(http://qt-project.org/doc/qt-4.8/qsqlquerymodel)。 html),或者你可以嘗試編寫你自己的QSql驅動程序(參見:http://qt-project.org/doc/qt-4.8/sql-driver.html#how-to-write-yourown -database-driver) –