A. matlab圖像處理內存不足怎麼辦
一般out of memenry存在以下幾種情況:
1、 變數需要的存儲空間超過了可用的內存空間
2、 數據需要的存儲空間,超過內存中最大的可用連續存儲空間
3 、程序和問題求解方法的設計不周,導致內存溢出。
解決方法如下:
1、為矩陣變數預制內存而不是動態分配
在動態分配的過程中,由於開始Matlab所用的Block隨著矩陣的增大而連續的為此矩陣分配內存,但是由於Block的不連續性,很有可能最開始分配的Block不能滿足存儲的需要,Matlab只好移動此Block以找到更大的Block來存儲,這樣在移動的過程中不但佔用了大量的時間,而且很有可能它找不到更大的塊,導致Out of Memory。而當你為矩陣變數預制內存時,Matlab會在計算開始前一次性找到最合適的Block,此時就不用為變數連續的分配內存。
比較下面兩個程序:
(1)for k = 2:1000
x(k) = x(k-1) + 5;
end
(2)x = zeros(1, 1000);
for k = 2:1000
x(k) = x(k-1) + 5;
end
顯然,第二個更好。最好的方法是,在程序一開始就位所有大的矩陣變數預制存存儲單元。
2、盡量早的分配大的矩陣變數
Matlab使用heap method管理內存。
當在Matlab heap中沒有足夠的內存使用時,它會向系統請求內存。
但是只要內存碎片可以存下當前的變數,Matlab會重新使用內存。
所在在大內存變數clear以後,新建的小內存變數仍可以使用那部分內存空間,但相反就不行了。比如說a變數4M,b、c、d、e分別為1M,如果a被clear以後定義bcde,則可以使用a的空間,如果clear b,c,d,e以後,假如這四個變數不是連續的,那麼a就不能使用它們釋放的內存。
3、盡量避免產生大的瞬時變數,當它們不用的時候應該及時clear
4、將矩陣轉化成稀疏形式
如果矩陣中有大量的0,最好存儲成稀疏形式。稀疏形式的矩陣使用內存更少,執行時間更短。
5、使用pack命令
當內存被分為很多碎片以後,其實本身可能有很大的空間,只是沒有作構的連續空間即大的Block而已。如果此時Out of Memory,此時使用pack命令可以很好的解決此問題。
6、如果可行的話,將一個大的矩陣劃分為幾個小的矩陣,這樣每一次使用的內存減少。
7、增大虛擬內存
Windows XP,右鍵「我的電腦」->屬性->高級->性能->設置,從而改變其虛擬內存。
Windows 7,右鍵「計算機」->屬性->(左邊欄)高級系統設置->高級->(性能)設置->高級->(虛擬內存)更改,建議物理內存的兩倍左右,如果物理內存已經3G+,那就不用調整了。
8、盡量少使用系統資源(對於Windows)
Windows中字體、窗口等都是要佔用系統資源的,所以在Matlab運行時盡量不要打開不用的窗口。
9、如果沒有必要,不要啟動java虛擬機,採用matlab -nojvm啟動 (在快捷方式屬性裡面的 "..../matlab.exe") 改為("...../matlab.exe" - nojvm)
10、關閉Matlab Server
B. linux系統存儲同一份文件的多個數據塊(block)是如何聯繫到一起的,和數據塊號的使用時如何聯系起來的
在linux文件系統中,一般是採用索引式文件系統,這種類型的文件系統在硬碟格式化的時候,會將硬碟上的數據塊分為兩種類型的塊,第一種是保存文件信息的inode塊,第二種就是實際存儲數據的data塊。data塊就是你所說的存放數據的地方,然後都有對應的編號,這些編號都是按照順序以表格的形式存放在inode塊中,。
因此,當你要讀取一個文件的內容時,它會先查找inode塊里信息,判斷你是否有許可權讀取這個文件,許可權判斷通過後,再去查找data塊編號變,然後根據編號表裡的編號依次查找所有的data塊,按順序拼接起來,就是一個完整文件的內容了。
C. CAD中創建BLOCK內部塊之後怎麼刪除
用"pu"命令,然後選擇不要塊,展開刪除即可.
D. 手機微信有個巨大的sns.block.00000文件,能清理掉么
可以啊,你可以使用騰訊手機管家進行清理, 它可以自動快速掃描和清理系統內各種垃圾文件, 釋放大量的存儲空間、更有深度清理功能, 針對清理垃圾文件、緩存文件、軟體的殘余、和多餘的安裝包。
E. 如何緩存一個block
magento是基於zend framework的,所以cache的使用基本也繼承了他的一些特性。我們要知道緩存中有幾個重要的概念:
數據本身;數據的標識;緩存生命期;緩存操作介面;
Zend_Cache 的使用比較簡單, 它可以把數據保存到 File, Memcache, sqlite 等介質(稱為後端, Backend)中. 還有前端(Frontend), 主要用來對要緩存的數據進行轉換, 如序列化.
Zend Framework 後端主要有
apc (Zend_Cache_Backend_Apc),
files (Zend_Cache_Backend_File),
memcached (Zend_Cache_Backend_Memcached)
and some more..
Magento 增加了幾種:
database (Varien_Cache_Backend_Database)
eaccelarator (Varien_Cache_Backend_Eaccelarator).
為了更深入的理解magento cache,本文就以緩存某個block為例,分析下他的工作流程和原理。在magento中,所有的block都是繼承自Mage_Core_Block_Abstract,當輸出某個block到頁面時,會調用到這個類的toHtml方法,該方法中有如下code片段:
[php] view plain
$html = $this->_loadCache();//載入緩存,假設為第一次載入,還沒有被緩存過,進入if代碼段
if ($html === false) {
$translate = Mage::getSingleton('core/translate');
/** @var $translate Mage_Core_Model_Translate */
if ($this->hasData('translate_inline')) {
$translate->setTranslateInline($this->getData('translate_inline'));
}
$this->_beforeToHtml();
$html = $this->_toHtml();
$this->_saveCache($html);//這句代碼很簡單,但卻在內部完成了大量的工作,下面進入它內部深入分析
if ($this->hasData('translate_inline')) {
$translate->setTranslateInline(true);
}
}
繼續看本類中的function _saveCache($data)
[php] view plain
function _saveCache($data)
/**
* Save block content to cache storage
*
* @param string $data
* @return Mage_Core_Block_Abstract
*/
protected function _saveCache($data)
{
if (is_null($this->getCacheLifetime()) || !Mage::app()->useCache(self::CACHE_GROUP)) {
return false;
}
$cacheKey = $this->getCacheKey();
/** @var $session Mage_Core_Model_Session */
$session = Mage::getSingleton('core/session');
$data = str_replace(
$session->getSessionIdQueryParam() . '=' . $session->getEncryptedSessionId(),
$this->_getSidPlaceholder($cacheKey),
$data
);
//可以肯定進入了Mage_Core_Model_App 的function saveCache
Mage::app()->saveCache($data, $cacheKey, $this->getCacheTags(), $this->getCacheLifetime());
return $this;
}
打開Mage_Core_Model_App 的function saveCache
[php] view plain
/**
* Saving cache data
*
* @param mixed $data
* @param string $id
* @param array $tags
* @return Mage_Core_Model_App
*/
public function saveCache($data, $id, $tags=array(), $lifeTime=false)
{
$this->_cache->save($data, $id, $tags, $lifeTime);
return $this;
}
可以看到$this->_cache這個對象調用了save,繼續看$this->_cache到底屬於哪個類的實例,在本類中找到protected function _initCache(),code如下:
[php] view plain
/**
* Initialize application cache instance
*
* @return Mage_Core_Model_App
*/
protected function _initCache()
{
$this->_isCacheLocked = true;
$options = $this->_config->getNode('global/cache');
if ($options) {
$options = $options->asArray();
} else {
$options = array();
}
//實例化Mage_Core_Model_Cache,並傳入參數$options
$this->_cache = Mage::getModel('core/cache', $options);
$this->_isCacheLocked = false;
return $this;
}
上面Mage::getModel('core/cache', $options)的$options是app/etc/local.xml中節點global/cache下的配置,假設ocal.xml如下:
[html] view plain
<config>
<global>
<cache>
<backend>apc</backend>
<slow_backend>File</slow_backend>
<auto_refresh_fast_cache>1</auto_refresh_fast_cache>
<prefix>MYSHOP_</prefix>
<default_priority>10</default_priority>
</cache>
</global>
</config>
能看到$this->_cache是實例化了實例化Mage_Core_Model_Cache,所以Mage_Core_Model_App 中的$this->_cache->save($data, $id, $tags, $lifeTime)即調用的Mage_Core_Model_Cache的function save。進入Mage_Core_Model_Cache的save:
[php] view plain
/**
* Save data
*
* @param string $data
* @param string $id
* @param array $tags
* @param int $lifeTime
* @return bool
*/
public function save($data, $id, $tags=array(), $lifeTime=null)
{
/**
* Add global magento cache tag to all cached data exclude config cache
*/
if (!in_array(Mage_Core_Model_Config::CACHE_TAG, $tags)) {
$tags[] = Mage_Core_Model_App::CACHE_TAG;
}
return $this->_frontend->save((string)$data, $this->_id($id), $this->_tags($tags), $lifeTime);
}
可以看到$this->_frontend->save(...)這句,那麼這里的_frontend是什麼呢?繼續看此類的構造函數(只列出部分code):
[php] view plain
$backend = $this->_getBackendOptions($options);
$frontend = $this->_getFrontendOptions($options);
$this->_frontend =Zend_Cache::factory('Varien_Cache_Core', $backend['type'], $frontend, $backend['options'],true, true, true);
沒錯_frontend就是類Varien_Cache_Core的一個實例,因為Varien_Cache_Core是繼承自Zend_Cache_Core,所以這里_frontend實際上實例化的是Zend_Cache_Core,即調用的是Zend_Cache_Core的save,再繼續分析,打開Zend_Cache_Core,找到function save它裡麵包含了如下代碼片段:
[php] view plain
if (($this->_extendedBackend) && ($this->_backendCapabilities['priority'])) {
$result = $this->_backend->save($data, $id, $tags, $specificLifetime, $priority);
} else {
$result = $this->_backend->save($data, $id, $tags, $specificLifetime);
}
可以看到這里實際上又變成了_backend的來調用的save,(開頭我們已經說了backend是用來保存數據的),那麼這里_backend到底是哪個backend(file,db,apc...)呢?繼續分析,在這個類裡面有一個方法setBackend:
[php] view plain
/**
* Set the backend
*
* @param Zend_Cache_Backend $backendObject
* @throws Zend_Cache_Exception
* @return void
*/
public function setBackend(Zend_Cache_Backend $backendObject)
{
$this->_backend= $backendObject;
// some options (listed in $_directivesList) have to be given
// to the backend too (even if they are not "backend specific")
$directives = array();
foreach (Zend_Cache_Core::$_directivesList as $directive) {
$directives[$directive] = $this->_options[$directive];
}
$this->_backend->setDirectives($directives);
if (in_array('Zend_Cache_Backend_ExtendedInterface', class_implements($this->_backend))) {
$this->_extendedBackend = true;
$this->_backendCapabilities = $this->_backend->getCapabilities();
}
}
裡面有$this->_backend= $backendObject這句,$backendObject是傳入的參數,那麼是何時調用的setBackend呢?實際上,這個方法是在上邊Mage_Core_Model_Cache里的save方法中調用$this->_frontend = Zend_Cache::factory('Varien_Cache_Core', $backend['type'], $frontend, $backend['options'], true, true, true);這句的的時候,已經被調用了,可以打開Zend_Cache的factory 方法查看,會發現有一句$frontendObject->setBackend($backendObject);參數$backendObject是factory傳入的參數$backend['type'],$backend['type']到底是什麼呢,我們在Mage_Core_Model_Cache的構造函數中看到$backend=$this->_getBackendOptions($options)這句,所以$backend是在本類的_getBackendOptions中被設置的,找到_getBackendOptions,code如下:
[php] view plain
/**
* Get cache backend options. Result array contain backend type ('type' key) and backend options ('options')
*
* @param array $cacheOptions
* @return array
*/
protected function _getBackendOptions(array $cacheOptions)
{
$enable2levels = false;
$type = isset($cacheOptions['backend']) ? $cacheOptions['backend'] : $this->_defaultBackend;
if (isset($cacheOptions['backend_options']) && is_array($cacheOptions['backend_options'])) {
$options = $cacheOptions['backend_options'];
} else {
$options = array();
}
$backendType = false;
switch (strtolower($type)) {
case 'sqlite':
if (extension_loaded('sqlite') && isset($options['cache_db_complete_path'])) {
$backendType = 'Sqlite';
}
break;
case 'memcached':
if (extension_loaded('memcache')) {
if (isset($cacheOptions['memcached'])) {
$options = $cacheOptions['memcached'];
}
$enable2levels = true;
$backendType = 'Memcached';
}
break;
case 'apc':
if (extension_loaded('apc') && ini_get('apc.enabled')) {
$enable2levels = true;
$backendType = 'Apc';
}
break;
case 'xcache':
if (extension_loaded('xcache')) {
$enable2levels = true;
$backendType = 'Xcache';
}
break;
case 'eaccelerator':
case 'varien_cache_backend_eaccelerator':
if (extension_loaded('eaccelerator') && ini_get('eaccelerator.enable')) {
$enable2levels = true;
$backendType = 'Varien_Cache_Backend_Eaccelerator';
}
break;
case 'database':
$backendType = 'Varien_Cache_Backend_Database';
$options = $this->getDbAdapterOptions();
break;
default:
if ($type != $this->_defaultBackend) {
try {
if (class_exists($type, true)) {
$implements = class_implements($type, true);
if (in_array('Zend_Cache_Backend_Interface', $implements)) {
$backendType = $type;
}
}
} catch (Exception $e) {
}
}
}
if (!$backendType) {
$backendType = $this->_defaultBackend;
foreach ($this->_defaultBackendOptions as $option => $value) {
if (!array_key_exists($option, $options)) {
$options[$option] = $value;
}
}
}
$backendOptions = array('type' => $backendType, 'options' => $options);
if ($enable2levels) {
$backendOptions = $this->_getTwoLevelsBackendOptions($backendOptions, $cacheOptions);
}
return $backendOptions;
}
代碼有些長,但這個方法很重要,後端具體使用什麼類型存儲緩存都是在這里被設置和轉換的,有代碼分析可知,默認的Backend為file,其他有sqlite, apc, memcached, xcache, eaccelerator, database等幾種類型,當backend是memcached, apc,xcache時,magento就自動開啟two level cache,具體設置可以自行看function _getTwoLevelsBackendOptions。
F. iOS中的block可以代替delegate嗎
1.apple力推block;
2.iOS8里新UIAlertViewController里的action已經全部用block實現;
3.swift里的閉包函,包括閉包內的簡化數;
4.就編程過程而言,block對開發者處理邏輯,編程效率,代碼閱讀都有積極影響,逐步使用block代替回調,代替target-action模式;
5.block出棧需要將使用的數據從棧內存拷貝到堆內存,對象就是加計數,使用完或者block置nil後才消除。delegate只是保存了一個對象指針,直接回調,沒有額外消耗。相對C的函數指針,只多做了一個查表動作。
6.delegate的弊病在ARC之前容易出現野指針。delegate比較適合純粹的一對一回調,如果牽扯多對一,代碼很臃腫。
7.delegate的優點在於運行成本低,適合運算強度較大、回調頻繁的環境。