c/c++存储大量复数问题, 如12.3123+42.12334,怎么存储占空间小?

龙在天涯m 2018-03-14 11:38:59
请教。我要存储大量的复数数据,如12.32131+5.12313j; 1.21231-1.1222j等等这样的数据,大概几百万个这样的数据。我该怎么存储成文件,占的空间比较小呢?我试了用 char*来存储,900w个这样的数据,大概要50+M。有什么办法让我转存到文件夹时,能占的容量小?谢谢
...全文
647 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2018-03-16
  • 打赏
  • 举报
回复
#include <stdio.h>
char *human(__int64 v) {
    __int64 g;
    int i,j;
    char N[8]=" KMGTPE";
    static char s[20];

    g=512i64;
    for (i=0;i<6;i++) {
        if (v<g) break;//
        g=g<<10;
    }
    j=(i-1)*10;
    if (j<0) j=0;
    if (j==0) {
        if (i==0) {
            sprintf(s,"%I64d B",v);
        } else {//i==1
            sprintf(s,"%.4lg KB",(double)v/1024.0);
        }
    } else {//j>0
        v=v>>j;
        sprintf(s,"%.4lg %cB",(double)v/1024.0,N[i]);
    }
    return s;
}
int main() {
    __int64 d,t;
    while (1) {
        printf("Input a number(0..%I64d):",0x7FFFFFFFFFFFFFFFi64);
        fflush(stdout);
        rewind(stdin);
        if (1==scanf("%I64i",&d)) {
            if (d>=0i64) break;//
        }
    }
    printf("%I64d is %s\n",d,human(d));

    printf("\n");
    d=0i64;t=512i64;
    while (1) {
        printf("0x%016I64x is %s\n",d,human(d));
        d+=t>>2;
        if (d>=t) {
            d=t-1i64;
            printf("0x%016I64x is %s\n",d,human(d));
            d=t;
            printf("0x%016I64x is %s\n",d,human(d));
            if (d>=0x2000000000000000i64) {
                d=0x7FFFFFFFFFFFFFFFi64;
                printf("0x%016I64x is %s\n",d,human(d));
                break;//
            }
            if (d<0x0800000000000000i64) {
                d=d<<8;
                t=t<<10;
            } else {
                t=d<<1;
                d+=t>>2;
            }
        }
    }

    return 0;
}
//Input a number(0..9223372036854775807):0x33333333333
//3518437208883 is 3.199 TB
//
//0x0000000000000000 is 0 B
//0x0000000000000080 is 128 B
//0x0000000000000100 is 256 B
//0x0000000000000180 is 384 B
//0x00000000000001ff is 511 B
//0x0000000000000200 is 0.5 KB
//0x0000000000020000 is 128 KB
//0x0000000000040000 is 256 KB
//0x0000000000060000 is 384 KB
//0x000000000007ffff is 512 KB
//0x0000000000080000 is 0.5 MB
//0x0000000008000000 is 128 MB
//0x0000000010000000 is 256 MB
//0x0000000018000000 is 384 MB
//0x000000001fffffff is 512 MB
//0x0000000020000000 is 0.5 GB
//0x0000002000000000 is 128 GB
//0x0000004000000000 is 256 GB
//0x0000006000000000 is 384 GB
//0x0000007fffffffff is 512 GB
//0x0000008000000000 is 0.5 TB
//0x0000800000000000 is 128 TB
//0x0001000000000000 is 256 TB
//0x0001800000000000 is 384 TB
//0x0001ffffffffffff is 512 TB
//0x0002000000000000 is 0.5 PB
//0x0200000000000000 is 128 PB
//0x0400000000000000 is 256 PB
//0x0600000000000000 is 384 PB
//0x07ffffffffffffff is 512 PB
//0x0800000000000000 is 0.5 EB
//0x0c00000000000000 is 0.75 EB
//0x0fffffffffffffff is 0.999 EB
//0x1000000000000000 is 1 EB
//0x1800000000000000 is 1.5 EB
//0x1fffffffffffffff is 1.999 EB
//0x2000000000000000 is 2 EB
//0x7fffffffffffffff is 7.999 EB

赵4老师 2018-03-16
  • 打赏
  • 举报
回复
引用 4 楼 DelphiGuy 的回复:
老赵这样也要68+MB,如果数据范围不大,精度要求不高,可以考虑转换成Half精度浮点保存,直接减掉一半,网上有很多开源的半精度浮点库。
只要不是68G甚至68T,都不算大。
赵4老师 2018-03-16
  • 打赏
  • 举报
回复
仅供参考:
// 创建文件句柄
HANDLE hFile = ::CreateFile(lpszFileName, GENERIC_READ, NULL, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
// 创建文件映射
HANDLE hMap = ::CreateFileMapping(hFile, NULL, PAGE_READONLY | SEC_COMMIT, NULL, NULL, NULL);
// 读取映射中的内存
LPVOID lpBuffer = ::MapViewOfFile(hMap, FILE_MAP_READ, NULL, NULL, NULL);

// 好了文件的内存已经获取了,你可以随意处理了

// 释放映射内存
::UnmapViewOfFile(lpBuffer);
// 关闭文件映射
::CloseHandle(hMap);
// close file handle
::CloseHandle(hFile);
  • 打赏
  • 举报
回复
引用 6 楼 zhao4zhong1 的回复:
[quote=引用 4 楼 DelphiGuy 的回复:] 老赵这样也要68+MB,如果数据范围不大,精度要求不高,可以考虑转换成Half精度浮点保存,直接减掉一半,网上有很多开源的半精度浮点库。
只要不是68G甚至68T,都不算大。[/quote] 我也认为几十/几百MB不算大,一个破手机APP几百MB的比比皆是,PC软件更是无所谓。关键是楼主认为50+MB比较大,我们得以此为前提提出意见。
龙在天涯m 2018-03-16
  • 打赏
  • 举报
回复
引用 6 楼 zhao4zhong1 的回复:
[quote=引用 4 楼 DelphiGuy 的回复:] 老赵这样也要68+MB,如果数据范围不大,精度要求不高,可以考虑转换成Half精度浮点保存,直接减掉一半,网上有很多开源的半精度浮点库。
只要不是68G甚至68T,都不算大。[/quote] 我还想请教下,假如我有10+个这样50+M的文件,也就是算起来大概500M。有没有什么好的方法来读取这些文件并使用呢?如果我一次读取到内存中,感觉太耗费内存了。之前看到有说用内存映射?
赵4老师 2018-03-15
  • 打赏
  • 举报
回复
实部和虚部分别使用一个float,fwrite
百合杰 2018-03-15
  • 打赏
  • 举报
回复
用char*? 不管效率了吗?
zhangyiant 2018-03-15
  • 打赏
  • 举报
回复
那么多数据,50'M挺正常的。要不就再压缩一下。可能也压不了多少。
龙在天涯m 2018-03-15
  • 打赏
  • 举报
回复
恩。之前想法不对,应该直接开个结构体,直接存储,不用直接char*了
  • 打赏
  • 举报
回复
老赵这样也要68+MB,如果数据范围不大,精度要求不高,可以考虑转换成Half精度浮点保存,直接减掉一半,网上有很多开源的半精度浮点库。

64,281

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧