2014年3月21日 星期五

[PHP] 使用 Memory Cache (php://memory) 加速 File Handle 操作

最近使用 maxmind / MaxMind-DB-Reader-php 時,發現大量處理很慢,研究一下 src / MaxMind / Db / Reader.php 後,發現 DB 沒有一口氣讀進記憶體使用,就找一下如何將檔案搬進 Memory 後,一樣用 File Handle 對 memory 操作,如此可以降低 source code 的更動。

用法(以 src / MaxMind / Db / Reader.php 為例):

$this->fileHandle = @fopen($database, 'rb');
if ($this->fileHandle === false) {
throw new \InvalidArgumentException(
"Error opening \"$database\"."
);
}

$this->fileSize = @filesize($database);
if ($this->fileSize === false) {
throw new \UnexpectedValueException(
"Error determining the size of \"$database\"."
);
}

// Add by changyy
$fp = fopen("php://memory", 'rb+');
if(is_resource($fp)) {
fputs($fp, fread($this->fileHandle, $this->fileSize) );
rewind($fp);
fclose($this->fileHandle);
$this->fileHandle = $fp;
}


使用的結果,在 Linode 2048 的機器上,測試 20k 筆資料,未加時約 65 秒,加了可以進步到 40 秒附近,稍微失落 Orz 此外,可以用 memory_get_peak_usage() 來的知記憶體的增減。

沒有留言:

張貼留言