V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
darnurash
V2EX  ›  Java

请教一个 web 接口设计

  •  
  •   darnurash · 2022-06-15 18:20:10 +08:00 · 2586 次点击
    这是一个创建于 652 天前的主题,其中的信息可能已经有所发展或是发生改变。

    现有一个基于 spring mvc 的独立 web 程序,无任何其他服务(数据库、redis 等统统没有) 需求是提供一个接口,返回一个大型 excel 文件中的内容。 因为文件比较大,读取的操作应该只能做一次 请问怎么高效实现这个接口

    20 条回复    2022-06-21 12:44:24 +08:00
    rock123
        1
    rock123  
       2022-06-15 18:46:44 +08:00
    预先解析 excel ,整理分割,重新组织成便于读取的数据结构,保存到内存,数据库,redis ,等等地方,供接口读取。excel 有变化了,定时或手动重新解析,看你的实际场景
    renmu123
        2
    renmu123  
       2022-06-15 18:55:01 +08:00 via Android
    你要不说说有多大,你可以起个 sqlite
    Ayanokouji
        3
    Ayanokouji  
       2022-06-15 18:57:25 +08:00
    没有复杂格式的话,可以考虑把 excel 转换成 csv ,直接内存应该就够了
    maocat
        4
    maocat  
       2022-06-15 18:59:34 +08:00 via iPhone   ❤️ 1
    数据流的形式给前端,让前端解析,前端做不出来就是他不行 /dog
    cco
        5
    cco  
       2022-06-15 19:39:31 +08:00   ❤️ 1
    excel 能有多大,有行列限制的。 一股脑返回就行,压力给到前端。
    Vegetable
        6
    Vegetable  
       2022-06-15 19:46:05 +08:00
    看大小,直接开局加载到 sqlite in memory ,后边就不管了。
    rabbbit
        7
    rabbbit  
       2022-06-15 19:53:06 +08:00   ❤️ 1
    直接发给前端即可,前端抗议性能差就上 V2 发个帖子:
    经过技术选型,我们放弃了 xxx,转向了 xxx.
    tramm
        8
    tramm  
       2022-06-15 19:53:14 +08:00
    不考虑内存的话,启动时读取,存内存里.
    rabbbit
        9
    rabbbit  
       2022-06-15 19:53:25 +08:00
    具体操作可以参考 https://www.v2ex.com/t/519999?p=3
    rabbbit
        10
    rabbbit  
       2022-06-15 19:55:53 +08:00
    算了不开玩笑了
    前端咋设计的,能分页吗?
    到底有多大,能否全读到内存里,然后前端按分页的形式展示.
    rabbbit
        11
    rabbbit  
       2022-06-15 20:03:08 +08:00
    其实如果用虚拟 Dom,前端抗个 1 万行 20 列没啥问题.加载速度大概在 2~3 秒吧.
    tairan2006
        12
    tairan2006  
       2022-06-15 21:59:46 +08:00
    > 因为文件比较大,读取的操作应该只能做一次 请问怎么高效实现这个接口

    文件大你不会分页么返回么,把 excel 转成 csv ,用 mmap 加载到内存里分段读取不就完了。
    xiongxin8802
        13
    xiongxin8802  
       2022-06-15 22:12:17 +08:00
    如果很大的话使用 csv 格式,分段先写入文件,然后下载这个文件
    DonaldY
        14
    DonaldY  
       2022-06-15 22:14:57 +08:00   ❤️ 1
    高效?
    文件扔 oss 里,前端请求访问就下载呗。
    superchrisliu
        15
    superchrisliu  
       2022-06-20 16:20:36 +08:00
    @DonaldY
    superchrisliu
        16
    superchrisliu  
       2022-06-20 16:21:23 +08:00
    @tairan2006 10g 也能用 mmap 吗
    tairan2006
        17
    tairan2006  
       2022-06-20 16:47:42 +08:00
    @superchrisliu 64 位机器肯定能映射 10g 的
    superchrisliu
        18
    superchrisliu  
       2022-06-21 09:11:04 +08:00
    @tairan2006 我刚去查了一下好像确实可以映射 10g ,最大值跟 Linux 内核参数有关?
    tairan2006
        19
    tairan2006  
       2022-06-21 12:43:04 +08:00
    @superchrisliu

    Although pointers are 64-bit wide, most processors do not actually support virtual addresses using the full 64 bits. To see what size virtual addresses your processor supports, look in /proc/cpuinfo (48 bits is typical).

    grep "address sizes" /proc/cpuinfo

    Additionally, half of the virtual address space is used by the kernel and not available to userspace - leaving 47 bits in the current Linux implementation.

    48 位理论上最大支持 128TB
    tairan2006
        20
    tairan2006  
       2022-06-21 12:44:24 +08:00
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3228 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 11:32 · PVG 19:32 · LAX 04:32 · JFK 07:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.