所以,我说实话。我是一个研究生,我写的代码不怎么漂亮。这可能是问题的一半。在
我的Python程序非常简单:我从Fortran二进制文件中读取记录,使用struct.unpack
对它们进行解压,然后将struct.unpack
返回的{list
。在
然后,我使用Python的list
模块将这些list
记录写入*.csv文件。在
我使用python2.7。在
为什么要这样做?好吧,Fortran二进制文件来自一个令人讨厌的封闭源代码程序,它已经有一段时间没有更新了。作者所做的只是发布一个文档,概述每个Fortran二进制文件的结构,这样我就可以使用struct.unpack
之类的东西从中读取数据。在
不是每个实验室的人都能编程,但每个人都能使用Excel。所以如果我们能把这些脏的二进制文件转换成组织更合理的*.csv文件,任何人都可以打开。在
我们计划进一步自动化后处理,以便最终删除Excel,即使这样,我们认为将数据保存在方便组织的*.csv文件中仍然非常好,因为我们可以使用csv
模块读取器函数以反映其在*.csv文件中的组织的方式读取数据。在
我的电脑有16GB的内存和64位的操作系统,但我使用的是32位的Python,我很确定。如果我没弄错的话,NumPy和SciPy在64位Python上有问题。在
一个即时的,尽管很难看的解决方法出现在脑海中,将CSV文件分解:即将包含10个时间步数据的Fortran二进制文件中的信息写入10个*.CSV文件,每个时间点一个。但是,有时候,不只是10个时间步,而是2000个。。。在
而且,每次,我都要关闭file对象,然后重新打开它,弄清楚我最后一次读表单的位置……等等,它看起来非常混乱,非常快。在
我还有别的选择吗?在
下面是一些框架代码,它们反映了我在代码中所做的工作:
recordSize = 24 #24 bytes in a record
fileObject = open("filepath", "rb")
csvRows = []
while True:
fout = fileObject.read(recordSize)
if len(fout) != recordSize:
break
else:
csvRows.append([x for x in struct.unpack("ffffff", fout)])
csvFileObject.writerows(csvRows)
我在csvRows.append([x for x in struct.unpack("ffffff", fout)])
行得到内存错误。在
如果你只是边写边写,而不是建立一个庞大的列表,你应该可以:
这给了我
^{pr2}$尽管我想在标题处写一些名字,但我还是要在标题处写一些名字。在
一些注意事项:(1)}。在
[x for x in something_or_other]
只是list(something_or_other)
,但是这里struct.unpack
已经返回了一个tuple
,它的效果同样好。(2) 在Python中,我们倾向于写record_size
,而不是{如果您想了解更多,请注意Python中一个使某些东西变懒的常见模式是逐个
yield
元素,类似于:yield
类似于return
,但它不会结束函数(“生成器”),它会保留状态,直到有东西调用它的next
,然后继续。(for
循环隐式地执行此操作)这允许您抽象出迭代逻辑。做完这些之后,你可以做一些其中,可以调用
print
,而不是print
,而不是存储所有行。在好吧,首先,你不会给我们代码来帮助你。我不是说你写的5000行,而是一个简短简洁的版本,我们可以开始。在
如果您已经达到python进程的内存限制,那么很可能是您将整个二进制文件放入内存中。要知道,你并没有填满16GB的内存,而只是你的系统允许你在一个进程中使用的内存。但是你不应该为你的进程增加内存限制,你应该改进你的算法。在
所以,与其读所有的东西,转换那个巨大的文件并把它写下来,为什么不把它变成一个流呢?基本的想法是:
创建CSV写入程序:
一次一行读取fortran文件(通常行的长度相同,或者在每个语句之间有一个标记)
^{pr2}$解析并处理这一行数据
将其写入CSV:
{cd1>只需要从文件中返回到真正的数据。如果我没有格式,我帮不了你写这个,但是它要么得到给定长度的数据:
或者它获取数据,直到指定的分隔符,然后将
open()
更改为open('fortran.bin', 'b', newline=0x20)
并使用以下命令迭代该文件:或者可能更复杂一些,您必须一次达到一个字节,并在编译完成后返回汇编语句:
那么内存中只有行的大小和fortran数据每行的临时变量。即使是一台Arduino大小的机器也能处理这个问题!在
以下是代码中的问题:
好的,下面是代码的更新,考虑到我的建议:
高温
相关问题 更多 >
编程相关推荐