我有一个包含一些无用数据的大型yaml文件。使用yaml.load()加载此文件时,内存消耗超出了我们计算机的物理限制。我看不懂。我是否只能读取python dict所需的部分数据?是否有一些库或代码来解决这个问题?
答案 0 :(得分:0)
使用PyYaml,您可以执行以下操作:
with open("file.yaml", 'r') as handle:
for event in yaml.parse(handle):
# handle the event here
它按事件处理YAML文件事件,而不是将其全部加载到数据结构中。当然,您现在需要从事件流中手动解析结构,但这允许您不进一步处理部分数据。
您可以查看PyYaml的Composer implementation,了解它如何从事件构造Python对象,以及它对事件流的期望结构。
答案 1 :(得分:0)
当您控制YAML输出的格式时,这是另一种有用的技术。您可以使用“ ---”分隔符将数据拆分为单独的YAML文档,而不是将数据作为单个结构。例如,代替
Class1 trans = new Class1();
MWArray[] input = new MWArray[] { r_h, l_h, r_l, l_l, l_0, r_0, r, u_hv, f1 };
MWArray[] output = new MWArray[6];
trans.Transformator(6, ref output, input);
MWNumericArray Abs_U_lv = output[0] as MWNumericArray;
//MWNumericArray Ang_U_lv = output[1] as MWNumericArray;
MWNumericArray Abs_I_hv = output[2] as MWNumericArray;
//MWNumericArray Ang_I_hv = output[3] as MWNumericArray;
MWNumericArray Abs_I_lv = output[4] as MWNumericArray;
//MWNumericArray Ang_I_lv = output[5] as MWNumericArray;
//var A= (double[])Abs_U_lv.ToArray();
//var C = (double[,])Abs_I_hv.ToArray();
//var E = (double[,])Abs_I_lv.ToArray();
/*double[,] A = new double[Fre.Count,1 ];
double[,] C = new double[1, Fre.Count];
double[,] E = new double[1, Fre.Count];*/
var A = (double[,])Abs_U_lv.ToArray();
//System.TypeLoadException: ""System.Double[,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,]" der Assembly "mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" hat zu viele Dimensionen."
var C = (double[,])Abs_I_hv.ToArray();
var E = (double[,])Abs_I_lv.ToArray();
您可以这样写:
- foo: 1
bar: 2
- foo: 2
bar: 10
,然后使用以下python代码对其进行解析:
foo: 1
bar: 2
---
foo: 2
bar: 10