2012-03-23 63 views
4

我有一個程序需要在Matlab中保存大約3000個打開的文件描述符。 原因是如果我不保持打開狀態,我需要打開並關閉它們超過10萬次,這意味着3億次開放關閉操作。考慮到每個文件都附加到每個文件並且fclose可能每秒佔用一秒以上(文件很大,即100mb +),應該清楚這種情況是不可接受的。在Windows中使用fopen在Matlab中增加打開文件描述符的最大數量

我知道文件句柄的Windows限制設置爲10000,但Matlab拒絕用fopen打開超過512個文件。我不知道如何強制它增加這個數字。

有人知道如何改變512的限制嗎?它在哪裏定義? 它甚至是Matlab的相關?

回答

2

你能不能真正審查程序和不同的結構它以從文件內容的部分記憶僅供工作?

例如,如果這是100萬行追加到3000個文件(即甚至不需要有什麼已經在文件中的任何陳述),你可以做這樣:

%% Main processing 
function [] FullProcess() 
%[   
    for block = 1:100, 

     % Partial processing 
     lines = processBlock(block); 

     % Save step 
     pushToFiles(block, lines);  

    end   
%] 

附:

% Partial processing in memory 
function [lines] = processBlock(block) 
%[ 
    % Preallocate 
    lines = cells(1000, 3000); 

    % Do the processing for current block 
    ... 
    lines{500, 12} = 'kikou'; 
    ... 
%] 

和:

%% Save partial work 
function [] = pushToFiles(block, lines) 
%[ 
    fcount = size(lines, 2); 
    lcount = size(lines, 1); 
    for fi = 1:fcount, 

     [fid, msg] = fopen(fprintf('f%i', fi), 'a'); % Open in append mode 
     if (fid < 0), error(msg); end 

     for li = 1:lcount, 
      fprintf(fid, lines{li, fi}); 
     end 

     fclose(fid); 

    end 
%] 

這減少的事情要做100的fopen/FCLOSE(300 0文件,但這遠遠小於以前的預期)

+0

順便說一句,你真的需要傳播數據超過3000個文件,並不會從數據庫/二進制文件工作效率更高。 。好吧,也許過度解釋或重構不適合在當前的情況下... – CitizenInsane 2012-03-24 14:40:33

+0

我需要生成單獨的文件用於並行程序,因此生成3000個文件目前是如何設計整個程序。我解決它類似於你的描述,但我只是寫500個文件組。 – twerdster 2012-03-25 19:28:46

+0

很好的閱讀,你已經能夠重構的東西。關於原始問題,這裏有一些有趣的[鏈接](http://www.codeproject.com/Articles/29959/Changing-FileDescriptor-s-Limit-and-TIME_WAIT-Limi)。 – CitizenInsane 2012-03-25 22:25:07

6

FWIW,下面是一些代碼來重現此問題:

fids = zeros(1,513); 
for ix = 1:length(fids) 
    fids(ix) = fopen(sprintf('testfile_%03d.tmp',ix),'w'); 
end 
fids(507:end) 

(在此之後,像「幫助」基本命令失敗,你需要運行fclose all)。

網絡搜索的一點點變成了其他人(對弱勢Q &一個論壇)有同樣的問題,但沒有簡單的解決方案(如this Mathworks forum post


我,當我遇到的第一本能Matlab的限制總是轉向Java。例如:

streamwriters = cell(1,513); 
for ix = 1:length(streamwriters) 
    strName = sprintf('testfile_2_%03d.tmp',ix); 
    streamwriters{ix} = java.io.FileOutputStream(strName); 
end 
streamwriters{513}.write(uint8('Some data to write')) 

是有成本的(我覺得幾毫秒)每次你從內Matlab的使Java調用,所以你你真的做1000000寫的,我會分析代碼,並尋找方法來收集內存中的代碼,並在需要時執行更少,更大的批量寫入。

還記得,你需要單獨關閉這些,例如,

for ix = 1:length(streamwriters) 
    streamwriters{ix}.close(); 
end 
相關問題