我目前有一個 for 回圈,它在串列中查找和存盤組合。可能的組合非常大,我需要能夠訪問組合。
我可以使用像 SQLite 這樣的空關系資料庫來將我的串列存盤在磁盤上,而不是使用 list = []?
基本上我要問的是是否有一個等效于 list = [] 的資料庫,我可以使用它來存盤通過我的腳本生成的組合?
編輯:
SQLlite 不是必須的。如果它可以完成我的任務,任何將作業。
這是給我帶來這么多麻煩的確切功能。一般來說,也許有更好的解決方案。
想法 - 我可以在每個回圈中將串列插入資料庫然后清空串列嗎?基本上,在每個回圈上創建一個串列,將該串列發送到 PostgreSQL,然后在 python 中清空該串列以降低 RAM 使用率?
def permute(set1, set2):
set1_combos = list(combinations(set1, 2))
set2_combos = list(combinations(set2, 8))
full_sets = []
for i in set1_combos:
for j in set2_combos:
full_sets.append(i j)
return full_sets
uj5u.com熱心網友回復:
好的,一些想法
我的第一個想法是,為什么要爆炸scombinations中的物件list?但是當然,由于我們有兩個嵌套for回圈,如果內部回圈中的迭代器沒有轉換為串列,則它會在外部回圈的第一次迭代中被消耗掉。
但是,您不需要分解兩個物件:您可以只分解較小的物件。例如,如果我們的兩個集合都由 50 個元素組成,則 2 個元素的組合為 1225,每個元素的 memsize(如果專案是整數)約為 120 位元組,即 147KB,而 8 個元素的組合為 5.36e 08記憶體大小約為 336 位元組,即 180GB。所以第一件事是,將較大的組合設定為一個combinations物件,并在外回圈中對其進行迭代。順便說一句,這也會更快。
現在是資料庫部分。我假設一個關系 DBMS,無論是 SQLite 還是其他任何東西。
您想創建一個定義了單個列的表。表格的每一行都將包含一個最終組合。您無需將append每個組合都添加到 alist中,而是將insert其放在表中。
現在的問題是,您需要如何訪問您創建的資料?您只需要按順序迭代最終的組合,還是需要查詢它們,例如查找包含一個特定值的所有組合?
在后一種情況下,您需要將列定義為 Primay Key,這樣您的查詢就會很有效;否則,您將使用自動遞增整數作為 PK 來節省磁盤空間(如果您沒有明確定義 PK,SQLite 將為您創建它,其他一些 DMBS 也會這樣做)。
最后一點:insert如果您不采取一些具體措施,該階段可能會非常緩慢:查看這個非常有趣的 SO 帖子以獲取詳細資訊。簡而言之,通過一些優化,它們能夠從insert每秒 85 到超過 96K。
編輯:迭代保存的資料
一旦我們在資料庫中獲得了資料,對它們進行迭代就可以很簡單:
mycursor.execute('SELECT * FROM <table> WHERE <conditions>')
for combo in mycursor.fetchall():
print(combo) #or do what you need
但是,如果您的條件沒有過濾掉大部分行,您將遇到與我們開始時相同的記憶體問題。第一步可能是使用fetchmany()或什fetchone()至代替,fetchall()但您仍然可能對查詢結果集的大小有疑問。
因此,您可能需要一次從資料庫中讀取一大塊資料,LIMIT利用. 最終結果可能類似于:OFFSETSELECT
chunck_size = 1000 #or whatever number fits your case
chunk_count = 0
chunk = mycursor.execute(f'SELECT * from <table> WHERE <conditions> LIMIT {chunk_size} ORDER BY <primarykey>'}
while chunk:
for combo in mycursor.fetchall():
print(combo) #or do what you need
chunk_count = 1
chunk = mycursor.execute(f'SELECT * from <table> WHERE <conditions> ORDER BY <primarykey>' OFFSET {chunk_size * chunk_count} LIMIT {chunk_size}}
請注意,您通常需要該ORDER BY子句來確保按預期回傳行,而不是隨機回傳。
uj5u.com熱心網友回復:
我不相信 SQLite 有內置的陣列資料型別。其他 DBMS,例如 PostgreSQL,也可以。
對于 SQLite,此站點上另一個用戶在 SQLite 中獲取陣列的好建議可以在這里找到:如何在 Sqlite3 中將陣列存盤在一列中?
可以找到另一個解決方案:https ://sqlite.org/forum/info/99a33767e8a07e59
無論哪種情況,是的,可以讓像 SQLite 這樣的 DBMS 存盤陣列(串列)型別。但是,它可能需要一些設定,具體取決于 DBMS。
編輯:如果您遇到記憶體問題,您是否考慮過將資料存盤為字串并在需要時訪問您需要的字串部分?
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/490813.html
