[英]Read in Python compressed data in C, using zlib
我有一个C代码,可以为物理模拟编写几个数据文件。 这些数据文件基本上是包含2d值映射的文本文件,范围从-1到+1。 它们可能相当大(每个大约100 Mb),但由于许多值通常是相同的(+1或-1的长串),我认为压缩它们是个好主意。
编写该文件的C代码的相关部分是:
FILE *fp1;
char file1[] = "output_file.dat";
fp1 = fopen(file1,"w");
for ( i = 0; i < Nx; i++ ) {
for ( j = 0; j < Ny; j++ ) {
fprintf(fp1, "%.5f ", creal(phi[i*Ny+j]));
}
fprintf(fp1, "\n");
}
fclose(fp1);
并且正在读取该文件的Python代码的相关部分是:
import numpy as np
data = np.loadtxt("output_file.dat")
现在,我正在尝试使用zlib
库添加压缩。 我用以下方式更改了C代码:
# include <zlib.h>
gzFile fp1;
char file1[] = "output_file.dat";
fp1 = gzopen(file1,"w");
for ( i = 0; i < Nx; i++ ) {
for ( j = 0; j < Ny; j++ ) {
gzprintf(fp1, "%.5f ", creal(phi[i*Ny+j]));
}
gzprintf(fp1, "\n");
}
gzclose(fp1);
和Python代码:
import numpy as np
import zlib
compressed_data = open("output_file.dat", 'rb').read()
data = zlib.decompress(compressed_data)
C代码似乎很好用。 正在写入数据文件,它们小于2 Mb(考虑到内容的冗余,这是合理的)。 不幸的是,Python脚本给了我一个错误:
error: Error -3 while decompressing data: incorrect header check
任何人都可以指出我如何调试它的正确方向? 谢谢!
好的,解决方案结果非常简单。 基本上,如果我使用.gz
扩展名编写数据文件:
# include <zlib.h>
gzFile fp1;
char file1[] = "output_file.gz";
fp1 = gzopen(file1,"w");
for ( i = 0; i < Nx; i++ ) {
for ( j = 0; j < Ny; j++ ) {
gzprintf(fp1, "%.5f ", creal(phi[i*Ny+j]));
}
gzprintf(fp1, "\n");
}
gzclose(fp1);
然后,我可以使用loadtext
函数来读取它们,它们将被numpy自动解压缩:
import numpy as np
data = np.loadtxt("output_file.gz")
或者,我仍然可以使用zlib.decompress
函数,但是再传递一个参数(如本问题中所述):
zlib.decompress(compressed_data, 15 + 32)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.