Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java/Clojure中处理大型数据集:littleBig数据_Java_Performance_Memory_Clojure - Fatal编程技术网

在Java/Clojure中处理大型数据集:littleBig数据

在Java/Clojure中处理大型数据集:littleBig数据,java,performance,memory,clojure,Java,Performance,Memory,Clojure,我一直在使用Clojure开发一个图形/数据处理应用程序()(尽管,通常感觉我使用的Java比Clojure多),并且已经开始使用更大的数据集测试我的应用程序。我对大约10万个点没有问题,但是当我开始变得更高时,我遇到了堆空间问题 现在,从理论上讲,大约50 GB应该足以容纳大约7000万双。诚然,我正在做许多需要一些开销的事情,事实上我可能同时在内存中保存2-3个数据副本,但我还没有进行太多优化,500k左右仍然比我应该能够加载的数据少几个数量级 我知道Java对堆的大小有人为的限制(可以更

我一直在使用Clojure开发一个图形/数据处理应用程序()(尽管,通常感觉我使用的Java比Clojure多),并且已经开始使用更大的数据集测试我的应用程序。我对大约10万个点没有问题,但是当我开始变得更高时,我遇到了堆空间问题

现在,从理论上讲,大约50 GB应该足以容纳大约7000万双。诚然,我正在做许多需要一些开销的事情,事实上我可能同时在内存中保存2-3个数据副本,但我还没有进行太多优化,500k左右仍然比我应该能够加载的数据少几个数量级


我知道Java对堆的大小有人为的限制(可以更改),并且我知道这些限制可以通过JVM启动时指定的选项进行更改。这就引出了我的第一个问题:

  • 如果我使用JVM启动时的Swank Clojure(通过Leiningen),我可以更改允许的最大堆空间吗

  • 如果我将这个应用程序(像我计划的那样)打包为Uberjar,我是否能够确保我的JVM具有某种最小的堆空间

但我并不满足于仅仅依靠JVM堆来驱动我的应用程序。我不知道我最终可能处理的数据的大小,但它可能达到数百万个点,而堆可能无法容纳这一点。因此,我感兴趣的是寻找替代方法,而不仅仅是在上面堆积数据。以下是我的一些想法,以及关于它们的问题:

  • 是否可以一次只读取一个大(文本)文件的一部分,这样我就可以一次导入并处理“块”中的数据,例如,
    n
    行?如果是,怎么做

  • 除了一次一点地读取文件外,是否还有其他更快的方法来访问我要读取的文件(可能更快,具体取决于实现)?如果你做过类似的事情,我想我是在问你过去对你有用的技巧/技巧

  • 我可以从文件中“取样”吗;e、 g.每
    z
    行只读取一次,有效地降低我的数据采样

现在我计划,如果有上述问题的答案(我会继续搜索!),或者提供的见解可以导致类似的解决方案,一次读取一块数据,将其绘制到时间轴上(–时间轴是绿色的),并允许用户仅与该点进行交互,直到她单击下一块(或其他),然后保存对文件所做的更改,加载下一个“块”数据并显示它

或者,我会显示所有数据的整个时间轴(下采样,以便加载),但在主窗口中一次只允许访问其中的一个“块”(绿色时间轴上方查看的部分,如时间轴中的视口矩形所示)


最重要的是,但是,有更好的方法吗?请注意,我无法对主窗口的数据进行下采样,因为我需要能够对其进行处理并让用户与其交互(例如,单击某个点或其附近的某个点以向该点添加“标记”:该标记作为该点上的垂直规则绘制)

如果您有任何见解、答案、建议或更正,我将不胜感激!我也愿意解释一下 以任何你愿意的方式回答我的问题

这将有望,至少部分,是开源的;我想要一个简单易用但又快速的方法来绘制Clojure世界中大量数据的xy图



编辑只有在绘制图形时才可能进行下采样,但不总是这样,具体取决于所绘制的零件。我需要访问所有数据以执行分析。(只是想澄清一下!)虽然我肯定应该研究下采样,但我认为这丝毫不能解决我的内存问题,因为我对图形所做的只是在一个缓冲区图像上绘图。

从左字段中抛出一些想法

你可能会在柯尔特图书馆里找到一些有用的东西

或者可能是内存映射I/O。

一些想法:

  • 在Java/Clojure中处理大型内存中数据集的最佳方法是使用大型原语数组。如果这样做,基本上只会比基础数据的大小多一点内存。使用aget/aset功能,您可以在Clojure中处理这些数组

  • 我很想减少取样,但如果需要,我会保持一种“按需”懒洋洋地访问详细点的方式,例如在用户交互案例中。有点像谷歌地图让你看到整个世界的方式,只在你放大时加载细节

  • 如果您只关心x-y绘图的输出图像,那么您可以通过一次加载几千个点(例如,加载到基本体数组中)来构建它,然后打印它们,然后丢弃它们。这样,您就不需要在内存中保存完整的数据集

我可以更改允许的最大堆吗 如果我使用Swank Clojure(通过 Leiningen)JVM在启动时有什么问题

您可以通过在启动时提供-Xms(最小堆)和-Xmx(最大堆)选项来更改Java堆大小,请参阅

所以类似于
java-Xms256m-Xmx1024m…
的东西将提供256MB的初始堆,并可以选择将其增长到1GB

我不使用Leiningen/Swank,但我希望可以更改它。如果没有其他内容,那么应该有一个Java启动脚本,您可以在其中更改参数

如果我打包此应用程序(如 计划)作为一个Uberjar,我会吗 能够确保我的JVM具有某种 最小堆空间

内存不是从jar文件中控制的,而是从启动脚本中控制的,通常是调用java并提供参数的.sh或.bat文件

我可以“取样”吗