代码之家  ›  专栏  ›  技术社区  ›  slipperypete

用java创建/编写由用户生成的大文件的正确方法是什么?

  •  0
  • slipperypete  · 技术社区  · 6 年前

    我的直觉告诉我要解决这个问题:

    • 读取第一个文件。
    • 进行数据转换。
    • 将内容写入新文件。
    • 将文件发送到服务。

    我错过什么了吗?有解决这类问题的最佳做法吗?

    3 回复  |  直到 6 年前
        1
  •  0
  •   user10367961 user10367961    6 年前

    你应该问的第一个问题是你是否 需要 首先将文件写入磁盘。即使您应该在处理阶段结束时将文件发送给使用者,也可以将文件内容保存在内存中并发送。使用者不关心文件是否存储在磁盘上,因为它只接收一个 字节数组

    将文件存储在磁盘上唯一有意义的场景是,您将通过磁盘文件在进程之间进行通信(即,您的生产者将文件写入磁盘,向使用者发送一些通知,然后使用者从磁盘读取文件(例如,根据从通知中收到的文件名)。

    缓冲器 读(或可能写)文件。这可以极大地减少内存开销(因为在给定时刻,您最终只会在内存中保留一个块,而不是整个20MB文件)。

    关于添加多个线程,您应该测试是否有助于提高应用程序性能。如果应用程序已经是I/O密集型的,那么添加多个线程将导致在I/O流上添加更多争用,这将导致性能下降。

        2
  •  0
  •   Alex Taylor    6 年前

    如果没有详细的情况,像这样的问题可以用现有的软件更好地解决,比如 Apache NiFi :

    它非常擅长提取文件,转换文件,并将它们放在其他地方(发送电子邮件,生成分析,等等)。NiFi是一个非常强大的工具,但是如果你需要的话,它可能是一个过度杀伤力的工具,因为它只提供了一些额外的设置。

        3
  •  0
  •   Stephen C    6 年前

    根据您的描述,我认为您应该在一个线程上对每个文件执行操作;i、 线程将下载文件,处理它,然后上传结果。

    如果需要并行性,那么将下载/处理/上载作为 Runnable 并将任务提交给 ExecutorService 有边界的线程池。并调整线程池的大小(如果将线程池大小公开为配置属性,那么这很容易。)

    为什么这样?

    1. 这很简单。需要最少的同步。


    可能会有帮助 . 但在现代(如Linux)操作系统上,在典型的现代机器上,内存<-&燃气轮机;磁盘I/O不太可能是主要的瓶颈。瓶颈很可能是网络I/O或服务器端I/O性能(特别是当服务器同时为其他客户机服务时)

    调整缓冲。让系统正常工作,对其进行基准测试,对其进行分析,然后