我的應用程序生成了一個大的(> 4GB)數據,我需要遍歷它調用每個數據元素上的python函數。高效使用python對象遍歷調用python函數的大量數據
我的數據將被分解爲「行」,我將定義幾個將引用此數據的python變量(對象)。理想情況下,這些對象將是天然形式,即我的數據將有雙打,整數和焦炭等陣列,即
struct DataRow
{
char key[ 32 ];
double value;
int source;
};
DataRow *rows = new DataRow[ 40000000 ];
我讀過一點點的PyBuffer對象可以「包裝」的內存區域上我假設我能夠構建其中的3個以指向第一行數據(鍵,值,源),然後構造一個元組並在代碼對象上調用PyObject_CallObject()早些準備。
PyObject *keyBuffer = PyBuffer_FromMemory(rows[ 0 ].key, 32);
PyObject *valueBuffer = PyBuffer_FromMemory(&rows[ 0 ].value, sizeof(double));
PyObject *sourceBuffer = PyBuffer_FromMemory(&rows[ 0 ].source, sizeof(int));
然而,這種做法似乎存在一些問題..
- 我如何推進由PyBuffer對象持有指向下一行的指針。
- 如何dererence雙和int緩衝區使用python腳本
我敢肯定,這必須是可能裏面thier值。如果不是這樣的話,那麼在所有行中使用python腳本可能會太慢,因爲我必須構建的PyObjects數量太多。
我看了一下示例代碼,我不太清楚你在哪裏重用在元組內創建的對象。看起來您正在創建一個新項目,從元組中提取現有項目,用新項目替換現有項目,然後遞減舊項目。這將導致每次「迭代」產生新的對象。你將如何去「重用」這些對象,而不是像你看起來那樣進行替換。 – ScaryAardvark 2012-02-28 14:37:46
@ScaryAardvark在''Py_REFCNT(result)== 1)''的分支中,* result *元組被重用。您可以嘗試更進一步,使用相同的技術重用元組中的每個int/float/str。 – 2012-02-28 18:03:05