0

我有一個擁有大約3000萬條目的數據庫,這是一個很多,我不希望任何事情,但更大的數據庫條目工作麻煩。獲取postgresql uniqueue日期的內存有效方法?

但是,使用py-postgresql和.prepare()聲明我希望我可以在「yield」的基礎上獲取條目,從而避免只用數據庫中的結果來填充我的內存,而我完全不能?

這是我到目前爲止有:

import postgresql 
user = 'test' 
passwd = 'test 
db = postgresql.open('pq://'+user+':'+passwd+'@192.168.1.1/mydb') 
results = db.prepare("SELECT time time FROM mytable") 
uniqueue_days = [] 
with db.xact(): 
    for row in result(): 
     if not row['time'] in uniqueue_days: 
      uniqueue_days.append(row['time']) 

print(uniqueue_days) 

甚至前往if not row['time'] in uniqueue_days:我耗盡內存,這是不是太奇怪考慮result()之前可能獲取befor通過他們循環所有的結果? 有沒有辦法讓圖書館postgresql變成「頁面」或者批量減少結果,比如說每輪有60k,或者甚至可以重複查詢來完成更多的工作?

在此先感謝!

編輯:應該提及數據庫中的日期是Unix時間戳,並且我打算在將它們添加到uniqueue_days列表中之前將它們轉換爲%Y-%m-%d格式。

回答

1

您可以讓數據庫完成所有繁重工作。 例如:不必讀取所有的數據到Python,然後計算unique_dates如果要嚴格執行,爲什麼不嘗試這樣的事情

SELECT DISTINCT DATE(to_timestamp(time)) AS UNIQUE_DATES FROM mytable; 

sort order上unique_dates返回然後執行以下操作:

SELECT DISTINCT DATE(to_timestamp(time)) AS UNIQUE_DATES 
FROM mytable 
order by 1; 

上述功能的有用參考:

Date/Time Functions and Operators

Data Type Formatting Functions

如果您想以塊的形式讀取數據,你可以使用你從上面查詢得到的日期,以進一步子集的結果下了線:

例:

'SELECT * FROM mytable mytable where time between' +UNIQUE_DATES[i] +'and'+ UNIQUE_DATES[j] ; 

凡UNIQUE_DATES [i] & [j]將是你從Python傳遞過來的參數。

我會留給你看看如何將date轉換成unix時間戳。

+0

謝謝,第一個例子給我的結果我需要直接從蝙蝠。第二個我已經想到了,但希望有更好的解決方案。花了一分鐘在postgresql內部計算結果,這比我希望的要好得多。所以謝謝! – Torxed

+1

考慮到您有數百萬行,並且您打算使用該字段來分類數據,您可能需要考慮在「時間」字段中添加索引。 – 2014-02-05 10:01:21

+0

我已經考慮過了,但是對於postgresql如何索引事物以及如何設置它有點新,但它在我的待辦事項列表中肯定會加速操作! – Torxed

3

如果您使用的是支持更好的psycopg2擴展,您可以在客戶端光標或fetchone上使用循環一次只獲取一行,因爲psycopg2使用服務器端門戶來備份其光標。

如果py-postgresql不支持類似的東西,你總是可以明確地使用DECLARE a cursor on the database sideFETCH rows from it progressively。我沒有看到文檔中的任何內容,表明py-postgresql可以在協議級別自動執行此操作,例如psycopg2

通常,您可以很容易地在數據庫驅動程序之間切換,但py-postgresql似乎不遵循Python DB-API,因此測試它需要進行一些更改。我仍然推薦它。

+0

我會考慮更改db-library,以確保它是否有優勢(以及它的聲音,可能會有)。 但是,由於這個特定項目的時間線問題,這將會走上正軌。但我只是想表達我對你的答案的感謝,因爲它是有用的,並將被使用! – Torxed