gpt4 book ai didi

java - 是否有在 Spring Boot 上下文中查询巨大 CSV 的最佳实践?

转载 作者:行者123 更新时间:2023-12-02 01:01:34 26 4
gpt4 key购买 nike

我在一家知名公司工作,参与一个项目,该项目应该与其他系统集成,每小时生成一个 27Gb 的 csv。目标是查询这些文件而不导入em(主要问题是官僚主义,如果某些数据发生变化,没有人愿意承担责任)。

此文件的主要过滤器可以按日期完成,最终用户必须插入范围开始结束日期。之后可以通过几个字符串进行过滤。

  • 上下文: Spring Boot 微服务
  • 服务器: xeon 处理器 24 核 256GB RAM
  • 文件系统:从外部服务器安装的 NFS
  • 测试数据:1000个文件,每个1Gb

为了提高性能,我按日期对文件进行索引,在每个文件名上写入包含的范围,并制作类似 yyyy/mm/dd 的文件夹结构。对于以下每个测试,第一步是创建将读取的原始文件路径列表。

研究将读取所有文件

  1. Spring 批处理 - 缓冲读取器并解析为对象:12,097 秒
  2. 普通 java - 线程池、缓冲读取器并解析为对象:10,882 秒
  3. 带有正则表达式和并行的 Linux egrep 从 java 运行并解析为对象:7,701 秒

最脏的也是禁食。我想避免它,因为安全部门警告我要对输入数据进行所有检查以防止 shell 注入(inject)。

谷歌搜索我发现mariadb CONNECT引擎也可以指向巨大的csv,所以现在我将继续用研究感兴趣的文件创建临时表,不好的部分是我必须做由于日期可能不同,因此每个查询对应一个表。

第一年,我们预计同一时间不会超过 5 项平行研究,平均范围为 3 周。此查询将异步完成。

你知道有什么可以帮助我的吗?不仅是为了速度,而且是一个很好的应用实践。非常感谢大家。

最佳答案

回答您的问题:

没有。 There are no best practices 。而且,据我所知,没有普遍适用的“良好”实践。

但我确实有一些一般性建议。如果您允许官僚主义和(在较小程度上)安全法令等考虑因素来决定您的技术解决方案,那么您最终可能会得到不合格的解决方案;即运行和持续运行缓慢或成本高昂的解决方案。 (如果“他们”希望速度快,那么“他们”就不应该给你设置障碍。)

我认为我们无法为您的问题提供简单的解决方案,但我可以对您的分析说一些话。

<小时/>

您提到了 grep 解决方案。

"I want avoid it because security department warned me about all checks to make on input data to prevent shell injection."

解决这个问题的方法很简单:不要使用中间 shell。危险的注入(inject)攻击将通过 shell 欺骗而不是 grep 进行。 Java 的 ProcessBuilder 不使用 shell,除非您明确使用 shell。 grep 程序本身只能读取其参数中指定的文件,并写入标准输出和标准错误。

<小时/>

您谈到了总体架构:

"The target is query these files without import them (the main problem is bureaucracy, nobody want responsibility if some data change)."

我不明白这里的反对意见。我们知道 CSV 文件将会发生变化。您每小时都会收到一个新的 27GB CSV 文件!

如果反对意见是 CSV 文件的格式将发生变化,那么这会影响您有效查询它们的能力。但只要发挥一点聪明才智,您就可以检测格式的变化并动态调整摄取过程。

<小时/>

"We're expecting not more than 5 parallel researches in same time, with an average of 3 weeks of range."

如果您还没有这样做,您需要进行一些分析,看看您提出的解决方案是否可行。估计需要扫描多少 CSV 数据才能满足典型查询。将该值乘以(例如)24 小时内执行的查询数量。然后将其与 NFS 服务器满足批量读取的能力进行比较。然后假设并行运行给定数量的查询,重新进行计算。

考虑一下如果您的(上述)期望是错误的,会发生什么。你只需要几个“白痴”用户做不合理的事情......

拥有 24 核服务器来执行查询是一回事,但 NFS 服务器还需要能够足够快地提供数据。您可以通过 NFS 调整来改进(例如,通过调整 block 大小、NFS 守护进程的数量、使用 FS-Cache),但最终的瓶颈将是将数据从 NFS 服务器的磁盘上获取并通过网络传输到您的服务器。请记住,当您的应用程序执行其操作时,可能有其他服务器“攻击”NFS 服务器。

关于java - 是否有在 Spring Boot 上下文中查询巨大 CSV 的最佳实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60571409/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com