2012-03-23 37 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 
相关问题