我有一个Java功能,对海量数据进行操作可以是500兆字节。我必须把这个500兆字节的数据传递给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。
将数据转换为Java对象(每行一个对象为同一类)。然后将对象作为数组传递给Java函数。
从表格数据中准备XML文档,并将XML文档传递给Java函数。Java函数内部从XML文档中提取对象。
将表格数据保存到文件中,并将文件作为参数输入到Java函数中。
这些想法在我的头脑中,如果有人能提供上述3种方法的利弊或建议一些新的方法,我会很感激。
为了给出一个好的答案,还需要更多的细节。你从哪里得到数据?这个函数和它有什么关系?
我想你得检验一下你的想法。这取决于要执行的处理操作。
只是为了纠正你,Java中没有函数,它只有方法。stackoverflow.com/a/16335031/1055241
从技术和历史上来说,GPRathour是正确的(如果你谈到Java语言),尽管你可以认为静态方法服务于函数的目的。无论如何,术语现在是一个相互矛盾的大混乱…
@gprathour是的…一个Java静态方法几乎是一个函数。我们不要陷入术语之争。
你能解释一下你想做什么以便让答案适应你的应用程序的上下文吗?
由于您有大量的数据以表格格式,您是否考虑使用Java数据库(数据库)?当然,这取决于您要做什么样的处理,需要开发多长时间,以及您对数据库/SQL的了解程度,但听起来您要逐行读取数据,数据库是一种很好的方法,尤其是对大量数据而言。
这里有关于JDBC API的信息,关于如何使用它:如何使用它:HTTP://DOCS.Oracle .COM/JavaSe/TutoRale/JDBC/ OutVIEW/NETXX.HTML
从Java路径:
The JDBC API is a Java API that can access any kind of tabular data, especially data stored in a Relational Database.
要记住的一些事情:
您必须了解/学习SQL或其他查询语言。
您将不得不设计并构建数据库的结构,尽管您可能可以使用与XML文件中计划的结构类似的结构。
钥匙!键是数据库中每行的唯一标识符,如ID号。我强烈建议您添加一个单独的字段/列来用作键,特别是当您不熟悉数据库时。它们会稍微增加数据库的内存开销,但是作为回报,您不必担心识别唯一的行,并且可以快速返回到已经搜索过的行。
您可以选择要引入的数据-不要引入超过您需要的数据。
我非常支持这个想法,尽管我从问题描述中解释了进行处理的方法已经存在,因此并不是设计用于数据库的。所以这也需要重新设计现有的代码。
如果您正在从一个文件或流中读取数据,那么您可以将该文件映射到内存中。所以它不会读取整个文件。看看这里
传递数组只会传递一个不涉及任何数据复制的引用,因此它是尽可能高效的。对数组的任何修改都将在引用的数组上完成。无需退货。
非常感谢你的建议。如果我要调用的函数在另一台服务器上,您能告诉我这个方法是否适用吗?
@Surjyanarayanapadhi如果您需要将500MB传递给另一个服务器进行方法调用,我会认真地建议您仔细研究一下您的体系结构。
不,您不希望通过某些RPC机制传递500MB。
@Tassobassoukos这不一定是一个架构问题。有很多应用程序需要传输大量数据作为其需求的一部分(例如视频流服务)。我建议您使用输入/输出流,这是用于数据传输的Java机制。使用流,您将有机会控制数据流,在发送/接收之前对其进行操作,等等。
@到目前为止,我知道有必要(我在98年在不同国家的气象模型的不同阶段之间转移了这个数量-有趣的时候)-只是作为一个函数调用做它是…次优,主要从内存使用的角度来看。
也可以考虑Java序列化!!
@Tassobassoukos首先需要做什么?我的意思是,除非必要,否则我将避免传递大约1/2 GB的数据。
如果您正在考虑通过Java函数/方法处理数据,请考虑立即处理数据块。同样,您可以根据一些计算确定块的大小,比如从10KB开始,然后查看性能和计算结果。这取决于执行环境。有几种方法可以从文件/流/数据库(即使是远程服务器)中获取数据块。您需要发布有关问题的更多详细信息,以获得更好的建议。