程序架构来处理大型. csv文件

19日视图(30天)
下午好
所以我有点担心。我刚刚花了一个星期写一个matlab程序,需要在大量数据从一个. csv文件
当我开始这个项目我选择了一个表变量类型,因为它的易用性与readtable等功能()
但是我没有坚持一个无法使用程序。过程我需要小时matlab . csv文件
我认为以下选项
matlab似乎尚未开发的任何性能表的数据类型与没有希望。
1:重写整个程序使用数组
问题,在我的文件都是十六进制值的数据。我需要将它们转换为十进制数字使用hex2dec函数仅适用于一个char数据类型。所以使用一组双打是不可能的。不知道去哪里
2:尽量使用paraelle工具箱重写这个程序
想法吗?

回答(5)

彼得·珀金斯
彼得·珀金斯 2021年7月28日
编辑:彼得·珀金斯 2021年7月28日
没有代码,很难给出具体的建议。
十六进制的问题,第一个建议我将会转换成矢量图写代码。你50 k调用加下标表明你在做标量在紧密循环操作。这不是最好的办法在MATLAB编写代码。再一次,没有多少信息,所以很难说。很多电话撑加下标表明你在做分配给一个变量使用括号,沃尔特指出,是低于使用点(因为它必须做更多)。这是一个不幸的差异并不突出的医生,但也许应该。在任何情况下,没有代码,所以…
沃尔特是正确的,因为18 b,性能,尤其是对分配到大表中,改善了不少。
如果你不能vectorize,你不能升级到新版本,这可能是没有必要“重写整个程序使用数组”。通常可以只关注紧环和“葫芦”的一些变量的表的一部分代码,然后放到。用表的组织和他们提供方便,在小剂量使用原始数值性能。表有很多,和永远不会和双数组一样快。这并不意味着你应该避免。
它真的可以帮助提供具体的代码示例。
3评论
沃尔特·罗伯森
沃尔特·罗伯森 2021年7月28日
很难讨论高水平项目架构没有理解的需要执行的操作。
例如有 一些 需求的最有效的方法是使用一个多维超立方体的人物,与任何一个“单词”存储为文本 (而不是典型的行)。但是还有其他的需要,你可能想要存储为“文字” 在一个超立方体。

登录置评。


沃尔特·罗伯森
沃尔特·罗伯森 2021年7月27日
一些 情况下,根据文件的格式,你有选择如何进行:
  • readtable()和readmatrix()和readcell()允许一个“格式”选项,使用相同的格式规范和使用textscan()——包括可能使用x %的格式(可能与长度规范,如果你的字段是固定的宽度)。
  • 您可以使用textscan()直接,因为你正在与文本文件
  • 您可以使用底层I / O命令,包括fscanf()或fgetl sscanf()(),根据你的文件是多么复杂。如果你的有效格式是足够复杂,你需要阅读一次一行,那么这可能会降低性能
  • 当你的文件不是很复杂,但是有不同的部分,还有高得惊人的性能改善是通过读取整个文件的文本和使用正则表达式()把它分成部分,然后textscan()或sscanf()部分。相对于循环性能测试每一行,。
4评论
罗伯特·斯科特
罗伯特·斯科特 2021年7月28日
谢谢你的评论。可能给它一枪

登录置评。


杰里米·休斯
杰里米·休斯 2021年7月28日
编辑:杰里米·休斯 2021年7月29日
首先,它将有助于看到一个示例文件,和一些示例代码演示了这个问题。
这是最好的我能说我看到的东西。
如果整个变量在十六进制格式,您可以使用导入选项转换迅速导入。
detectImportOptions 将会看到 0 x1a 作为一个十六进制值,但不是没有前缀,但它可以被解读为十六进制,如果你问。
选择= detectImportOptions(文件名,“分隔符”,”、“)
% varNamesOrNumbers = [1 3 5]
%或varNamesOrNumbers = (“Var1”、“Var3”)
选择= setvaropts (varNamesOrNumbers选择,“NumberSystem”,“六角”,“类型”,“汽车”);
%,也可以提高阅读能力仅仅通过选择列
%你想(这是可选的)
选择。SelectedVariableNames =选择。VariableNames ([1 3 5 7 9]);
T = readtable(文件名,选择)
12个评论
dpb
dpb 2021年7月31日
如果我能提前把它作为十六进制值我将以更好的状态。你们可以提供建议吗?”
这上面已经完成由沃尔特。
注: readXXX 的新形式 readmatrix 所有通过的重任 readtable 最后;其他人只是前端给它一些klews的文件的内容,并指定如何将数据返回给调用者。
这些可能会提供一个小的性能提升readtable;他们主要做的是返回一个数组或单元阵列代替一个表。如果所有的操作都是基于一个数组,那么可能没有优势在使用表格。
然而,使用 detectImportOptions 和自定义导入对象包括变量类型十六进制,他们几乎肯定会给好处——主要是导入数据的十进制值而不是“字符”或cellstr或字符串,然后将不得不转换——相反,通过工作系统i / o库。

登录置评。


罗伯特·斯科特
罗伯特·斯科特 2021年8月3日
我想回到这个thead。
我已经在这个项目投入大量的时间,想谢谢每个人附和道。
我已经找到了自己的答案,我真的惊讶没有人提到过,我可以看到。
答案是,你不能! ! !你不能读取大文件。matlab的方式将这些文件到ram中大部分开销。我重写程序书中每一个技巧和管理近1000倍的速度增加我的牧师1 !你猜怎么着!它仍然没有足够好。当我开始问我的程序,现在速度极快,各种技巧,vectorizing, parfor循环等运行10 k线文件我有美妙的速度。500年我们一行!这是优秀的。猜猜发生了什么当你读的文件有500 k线,我的500年美国现在是500 ms。 The answer is you just cant. You cant bring in all the data locally and not impact performance. You need to read it one line at a time OUTSIDE of matlab so matlab doesnt slow down.
这就是答案,这是这篇文章的要点。答案是使用 fopen函数和 。函数可以很快速。
逐行读取文件解析它。这是唯一的方法。这也使从填充您的ram。
我希望我的痛苦和suffereing可能在未来帮助别人。甚至不去高阵列和数据存储。所有这些东西都多的开销和什么是一个实际的解决方案是你的灭亡。
fopen函数,然后逐行读取它。函数可以执行在美国范围内,从未被内存慢了下来。
什么浪费10天这是我。由于每个人都支持这种学习实验。万博1manbetx
3评论
dpb
dpb 2021年8月3日
“…每一行包含四个十六进制数字的重复条目代表签署了16位数字……” @Walter罗伯森
我终于得到了一个响应,所有十六进制/记录除了每个记录的第一个和最后一个元素,但是从来没有回应过,这两个是什么。所有其他的细节仍不透明给出拒绝提供任何进一步的有用的细节……

登录置评。


罗伯特·斯科特
罗伯特·斯科特 2021年8月3日
这种情况下是关闭的。我感谢你们所有人对你的帮助,我不能分享或任何进一步的讨论这个问题。我已经说过很多次我不能分享任何其他然后一般matlab prinicipals概括讨论matlab本身是如何工作的。我有使用fgets找到一个合适的解决方案。美好的一天。

标签

s manbetx 845


释放

R2018b

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!