【问题标题】:Whats the efficient way to pass huge data to a java function?将大量数据传递给java函数的有效方法是什么?
【发布时间】:2014-08-15 14:23:49
【问题描述】:

我有一个 java 函数,它对大量数据进行操作,可能是 500MB。我必须将这 500MB 的数据传递给 java 函数,并在从 java 函数处理后返回数据。

我的表格形式如下

col1  col2 col3 col4 col5 col6
 3     5    2     5    1   6
 7     5    6     8    3   8
 5     3    7     9    8   1

我的想法很少,但不知道哪一个是有效的,以及如何实现,比如我需要哪些 java api。

  1. 将数据转换为 java 对象(每一行一个相同类的对象)。然后将对象作为数组传递给 java 函数。
  2. 从表格数据准备 XML 文档并将 XML 文档传递给 java 函数。内部 java 函数从 XML 文档中提取对象。
  3. 将表格数据保存到文件中,并将文件作为参数输入到 java 函数中。

这些想法是我的想法,如果有人能提供以上3种方法的优缺点或提出一些新方法,将不胜感激。

【问题讨论】:

  • 为了给出一个好的答案,需要更多的细节。你从哪里得到数据?它的功能是什么?
  • 我认为你必须测试你的想法。这取决于您要执行的处理操作。
  • 只是为了纠正你,Java 中没有函数,它只有 方法stackoverflow.com/a/16335031/1055241
  • @GPRathour 从技术上和历史上讲你是正确的(如果你谈到 Java 语言),尽管你可能会争辩说静态方法服务于函数的目的。在任何情况下,术语现在都是一个很大的相互矛盾的混乱......
  • @GPRathour 是的...好吧,Java 静态方法几乎就是一个函数。让我们不要陷入命名之争。

标签: java methods parameter-passing


【解决方案1】:

由于您有大量的表格格式的数据,您是否考虑过使用 Java DB(数据库)?当然,这取决于您要进行哪种处理,您需要开发多长时间以及您对数据库/SQL 的了解程度,但听起来您将逐行读取数据和数据库是执行此操作的好方法 - 尤其是在处理大量数据时。

Java Trail 上有关于 JDBC API 的信息,以及如何使用它的步骤:http://docs.oracle.com/javase/tutorial/jdbc/overview/index.html

来自 Java Trail:

JDBC API 是一种 Java API,可以访问任何类型的表格数据,尤其是存储在关系数据库中的数据。

注意事项:

  • 您必须了解/学习 SQL 或其他查询语言。
  • 您必须设计并构建数据库的结构,尽管您可能可以使用与您在 XML 文件中计划的结构类似的结构。
  • 钥匙!键是数据库中每一行的唯一标识符,例如 ID 号。我强烈建议您添加一个单独的字段/列以用作键,特别是如果您是数据库新手。它们会稍微增加数据库的内存开销,但作为回报,您不必担心识别唯一行,并且可以快速返回到您已经搜索过的行。
  • 您可以挑选要引入的数据 - 不要引入超出您需要的数据。

【讨论】:

  • 我非常支持这个想法,尽管我从问题描述中解释说,进行处理的方法已经存在,因此不适用于数据库。所以这也需要重新设计现有的代码。
【解决方案2】:

如果您正在考虑通过 Java 函数/方法处理数据,请考虑一次处理数据块。再次,您可以根据一些计算来决定 Chunk 的大小,例如从 10 KB 开始,然后查看性能并进行计算。这取决于执行环境。 有几种方法可以从文件/流/数据库中获取数据块(即使它是远程服务器)。您需要发布有关您的问题的更多详细信息以获得更好的建议。

【讨论】:

    【解决方案3】:

    如果您正在从文件或流中读取数据,则可以将文件映射到内存中。所以它不会读取整个文件。看here

    【讨论】:

      【解决方案4】:

      传递一个数组只会传递一个不涉及任何数据复制的引用,因此尽可能高效。对数组的任何修改都将在引用的数组上完成。什么都不需要退回。

      【讨论】:

      • 非常感谢您的建议。如果我要调用的函数在另一台服务器上,请告诉我此方法是否适用?
      • @SurjyaNarayanaPadhi 如果您需要将 500 MB 传递到另一台服务器以进行方法调用,我强烈建议您仔细、长期地查看您的架构。
      • 不,你不想通过一些 RPC 机制传递 500MB。
      • @TassosBassoukos 这不一定是架构问题。有很多应用程序需要传输大量数据作为其需求的一部分(例如视频流服务)。我建议您使用输入/输出流,这是用于数据传输的预期 Java 机制。使用流,您可以控制数据流,在发送之前/接收之后对其进行操作,等等。
      • @eitanfar 我知道有需要(我在 98 年在不同国家的气象模型的不同阶段之间转移了这个数量 - 有趣的时光) - 只是这样做函数调用是...次优的,主要从内存使用的角度来看。
      猜你喜欢
      • 2020-10-18
      • 2014-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-12
      • 1970-01-01
      • 2017-04-03
      • 1970-01-01
      相关资源
      最近更新 更多