我一直致力于使用Clojure的图形/数据处理应用程序(you can see a screenshot here)(尽管通常感觉我使用的Java比Clojure多),并且开始用更大的数据集测试我的应用程序。我在100k点左右没有问题,但是当我开始比这更高时,我遇到了堆空间问题。在Java/Clojure中处理大型数据集:littleBig data
现在理论上大约半个GB应该足以容纳7000万双。当然,我正在做很多事情,需要一些开销,而且实际上我可能同时在内存中保存2-3份数据,但我还没有优化太多,500k左右仍然是数量级小于,我应该可以加载。
据我所知,Java有人为限制对堆的大小(可改变的),我理解那些可以改变的,部分与选项,你可以指定为JVM启动。这使我对我第一个问题:
我可以改变,如果我使用斯旺克,Clojure中允许的最大堆空间(通过Leiningen)的JVM对启动?
如果我将这个应用程序打包为Uberjar,我能否确保我的JVM具有某种最小堆空间?
但我不满足于依靠JVM堆来驱动我的应用程序。我不知道我最终可能会使用的数据的大小,但它可能达到数百万个点,也许堆不能适应。因此,我很有兴趣找到替代数据的方法。这里有一些想法我有,和问题关于他们:
是否有可能在一个时间一个大的(文本)文件只有部分阅读,这样我就可以导入和处理数据“块”,例如,
n
一次一行?如果是这样,怎么样?是否有一些更快的方式来访问我正在阅读的文件(可能很快,取决于实施),而不是简单地从它读取一次? 我想我在这里问的是,如果你做过类似的事情,那么过去曾经为你工作过的任何提示/黑客行为。
我可以从文件中“取样”例如只读取每个
z
行,有效地对我的数据进行降采样?
现在我打算,如果有一次是回答上述(我会继续找下去!),或提出见解导致等同的解决方案,在数据块读取,图它到时间线(see the screenshot-时间线是绿色的),并允许用户与该位交互,直到她点击next chunk
(或其他),然后我将保存对文件所做的更改并加载下一个“块”数据并显示它。或者,我会显示所有数据的全部时间轴(缩减采样,因此我可以加载它),但只允许在主窗口中一次访问它的一个“块”(部分是在绿色时间线上方查看,如时间轴中视窗矩形所示)。
最重要的是,虽然,有没有更好的办法?请注意,我无法对主窗口的数据进行缩减采样,因为我需要能够处理它并让用户与其交互(例如,单击一个点或靠近某个点以向该点添加“标记”:该标记被绘制为在这一点上的垂直规则)。
我会很感激任何见解,答案,建议或更正!我也愿意以任何你喜欢的方式在我的问题上阐述 。
这将有望至少部分是开源的;我想要一个简单易用而又快速的方法来在Clojure世界中创建大量数据的xy图。
编辑下采样可能只绘制图形时,并不总是那么,根据所绘制的部分。我需要访问所有数据以进行分析。 (只要清除它!)虽然我绝对应该考虑下采样,但我认为这不会解决我的内存问题,因为我正在做的所有工作都是在BufferedImage上绘图。
非常感谢你的出色答案:我很快就会尝试其中的一些建议。 – Isaac 2010-08-05 12:23:57
我使用java.io.RandomAccessFile和许多Seeks/readBytes去给我一个快速返回文件的“块”的函数。所以我一次可以要求512000字节块,并选择前一个块或下一个块。我很快就会发布该功能,但非常感谢您的帮助! – Isaac 2010-08-05 17:01:33
不客气。为了进一步优化,我建议连接探查器(比如VisualVM:https://visualvm.dev.java.net/),它会告诉你时间和内存在哪里。项目祝你好运:) – 2010-08-05 17:20:34