【问题标题】:Creating large txt file filled with arbitrary data in MATLAB在 MATLAB 中创建填充任意数据的大型 txt 文件
【发布时间】:2015-08-26 11:32:57
【问题描述】:

我想在 MATLAB 中创建一个 txt 文件,例如2GB 大(为简单起见不是 GiB)。它可以包含任意数据。 在 Python(或 C)中,可以简单地做到这一点(Python 3.4 代码):

path = r'D:\\file.txt' 
f = open(path, 'w') 
f.seek(2e9 - 1)
f.write('\x00')
f.close()

这种方法(即寻找过去的文件结尾并写入单个 NUL 值)在 MATLAB R2007b 中不起作用,尽管这种方法在 MATLAB 中有效:

path = 'D:\file.txt';    
f = fopen(path, 'w'); % or 'W'    
fwrite(f, 0, 'uint8', 2e9 - 1);    
fclose(f);    

问题是使用 MATLAB 几乎比 Python 慢 17 倍。我没想到执行速度更快,但 17 倍太多了,1 分钟 17 分钟是天壤之别。
在 MATLAB 中有没有更快的方法来做到这一点?

规格:

  • 操作系统:Windows
  • MATLAB:R2007b
  • 文件系统:FAT32

编辑:
MATLAB 中与 Python 中相同的方法不起作用,因为 fseek 返回 -1,可能它达到 EOF 并且不喜欢它。这是代码:

path = 'D:\file.txt';    
f = fopen(path, 'w'); % or 'W'    
fseek(f, 2e9 -  1, 'bof') ;
fwrite(f, uint8(0));    
fclose(f);  

【问题讨论】:

  • R2007b 太旧了,你没有考虑升级到新版本吗? MATLAB中的文件写入函数例如dlmwrite、sprintf、table、fwrite 等。很多选项需要考虑。我对 Python 不熟悉,但我怀疑在过去 7 年中,MATLAB 和 Python 的效率都有很多改进。
  • 我肯定会在较新的版本中尝试它,但现在我坚持使用这个。我还读到 fwrite 是最快的方法,但你可以看到它仍然很慢。此外,python 代码仅用作“伪代码”,在 C 语言中非常相似 :)
  • 你在两个代码 sn-ps 中做的事情不一样,所以这就引出了一个问题:你为什么期望得到可比较的结果?
  • 正如我所提到的,fseek 方法在 Matlab 中不起作用,它以代码退出 - 1
  • @LStarling,你没有提到...

标签: matlab


【解决方案1】:

尝试在 MATLAB 中执行与 Python 中相同的操作:

tic;
path = 'D:\file.txt';    
f = fopen(path, 'W');
fseek(f, 2e9 - 1, 'eof'); %'Try with 2e8, 2e7...'
fwrite(f, uint8(0));
fclose(f);
toc;

(显然在 R2007b 中寻找过去的文件 EOF 不起作用)

或者,从 MATLAB 执行快速编写 Python 脚本:

cmd_template = 'python.exe C:\\PathToScript\\new_file.py "%s"'
system(sprintf(cmd_template, 'D:\file.txt'));

当然,“new_file.py”必须接受至少一个输入参数,即新文件名。

【讨论】:

  • 这在 R2014b 中只给了我一个 1 行文件。不过它非常快,0.001316 秒!哇!
  • @CST-Link 在 MATLAB 中执行 python 脚本就像一个魅力,虽然它实际上不是 MATLAB 解决方案,是吗? :D 无论哪种方式,它都有效,而且您在回答中也提到了它是旧版本问题...非常感谢:) PS:\ 是 Python 中的转义字符,所以路径中应该有 \\,我相信 :)
  • @LStarling 没问题。我感受到你的痛苦:有时我也对旧版本的局限性感到沮丧,并且需要处理手头的任何东西。至于双反斜杠问题,这应该在两个地方都修复。因为反斜杠对于 MATLAB 的 sprintf 也是转义字符。好点,现在更正代码。
  • @CST-Link 我必须再次感谢您,因为由于您的回答,我正在考虑执行 python 脚本,并且我知道可能有一个系统命令可以执行我想要的操作.. .嗯....有:D
【解决方案2】:

嗯...这在淋浴时击中了我,这当然是平台相关的。

system('fsutil file createnew file.txt 2000000000');

我不知道为什么我没有早点想到这个:D

【讨论】:

  • 很好。 :-) 而且我认为 R2007b 是一个比 Win MATLAB 安装更受限制的条件,所以每个平台特定的东西都是需要考虑的。您可以使用函数 vercomputer 优雅地从最初的关于 MATLAB 版本和操作系统的假设中回退。
猜你喜欢
  • 2022-01-19
  • 2019-03-10
  • 1970-01-01
  • 1970-01-01
  • 2021-02-16
  • 2023-03-31
  • 2015-03-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多