在Java/Clojure中处理大型数据集:littleBig数据
我一直在使用Clojure开发一个图形/数据处理应用程序()(尽管,通常感觉我使用的Java比Clojure多),并且已经开始使用更大的数据集测试我的应用程序。我对大约10万个点没有问题,但是当我开始变得更高时,我遇到了堆空间问题 现在,从理论上讲,大约50 GB应该足以容纳大约7000万双。诚然,我正在做许多需要一些开销的事情,事实上我可能同时在内存中保存2-3个数据副本,但我还没有进行太多优化,500k左右仍然比我应该能够加载的数据少几个数量级在Java/Clojure中处理大型数据集:littleBig数据,java,performance,memory,clojure,Java,Performance,Memory,Clojure,我一直在使用Clojure开发一个图形/数据处理应用程序()(尽管,通常感觉我使用的Java比Clojure多),并且已经开始使用更大的数据集测试我的应用程序。我对大约10万个点没有问题,但是当我开始变得更高时,我遇到了堆空间问题 现在,从理论上讲,大约50 GB应该足以容纳大约7000万双。诚然,我正在做许多需要一些开销的事情,事实上我可能同时在内存中保存2-3个数据副本,但我还没有进行太多优化,500k左右仍然比我应该能够加载的数据少几个数量级 我知道Java对堆的大小有人为的限制(可以更
我知道Java对堆的大小有人为的限制(可以更改),并且我知道这些限制可以通过JVM启动时指定的选项进行更改。这就引出了我的第一个问题:
- 如果我使用JVM启动时的Swank Clojure(通过Leiningen),我可以更改允许的最大堆空间吗
- 如果我将这个应用程序(像我计划的那样)打包为Uberjar,我是否能够确保我的JVM具有某种最小的堆空间
- 是否可以一次只读取一个大(文本)文件的一部分,这样我就可以一次导入并处理“块”中的数据,例如,
行?如果是,怎么做n
- 除了一次一点地读取文件外,是否还有其他更快的方法来访问我要读取的文件(可能更快,具体取决于实现)?如果你做过类似的事情,我想我是在问你过去对你有用的技巧/技巧
- 我可以从文件中“取样”吗;e、 g.每
行只读取一次,有效地降低我的数据采样z
最重要的是,但是,有更好的方法吗?请注意,我无法对主窗口的数据进行下采样,因为我需要能够对其进行处理并让用户与其交互(例如,单击某个点或其附近的某个点以向该点添加“标记”:该标记作为该点上的垂直规则绘制) 如果您有任何见解、答案、建议或更正,我将不胜感激!我也愿意解释一下 以任何你愿意的方式回答我的问题 这将有望,至少部分,是开源的;我想要一个简单易用但又快速的方法来绘制Clojure世界中大量数据的xy图
编辑只有在绘制图形时才可能进行下采样,但不总是这样,具体取决于所绘制的零件。我需要访问所有数据以执行分析。(只是想澄清一下!)虽然我肯定应该研究下采样,但我认为这丝毫不能解决我的内存问题,因为我对图形所做的只是在一个缓冲区图像上绘图。从左字段中抛出一些想法 你可能会在柯尔特图书馆里找到一些有用的东西 或者可能是内存映射I/O。一些想法:
- 在Java/Clojure中处理大型内存中数据集的最佳方法是使用大型原语数组。如果这样做,基本上只会比基础数据的大小多一点内存。使用aget/aset功能,您可以在Clojure中处理这些数组
- 我很想减少取样,但如果需要,我会保持一种“按需”懒洋洋地访问详细点的方式,例如在用户交互案例中。有点像谷歌地图让你看到整个世界的方式,只在你放大时加载细节
- 如果您只关心x-y绘图的输出图像,那么您可以通过一次加载几千个点(例如,加载到基本体数组中)来构建它,然后打印它们,然后丢弃它们。这样,您就不需要在内存中保存完整的数据集
java-Xms256m-Xmx1024m…
的东西将提供256MB的初始堆,并可以选择将其增长到1GB
我不使用Leiningen/Swank,但我希望可以更改它。如果没有其他内容,那么应该有一个Java启动脚本,您可以在其中更改参数
如果我打包此应用程序(如
计划)作为一个Uberjar,我会吗
能够确保我的JVM具有某种
最小堆空间
内存不是从jar文件中控制的,而是从启动脚本中控制的,通常是调用java并提供参数的.sh或.bat文件
我可以“取样”吗