【发布时间】:2011-11-03 05:37:36
【问题描述】:
我有一个问题,我需要处理一些大小在几 kb 到最大 1 GB 范围内的文件。用例是这样的输入是某种平面文件格式,其中数据存储在一行中,比如一些支付指令。应用程序必须通过每个支付指令并根据一些分组逻辑形成组。最后,必须将组转换为另一种格式(ISO 20022 xml),使用该格式进行支付处理。
目前的设计是这样的,我们有两个表,其中分组标准数据存储在一个表中,单个支付指令存储在另一个表中(从组表到支付指令表的一对多关系)。在第 1 步中:当我们浏览平面文件时,我们识别它所属的组,并写入数据库(btw 批量提交)。
在第 2 步中:在批处理中,组被一一读取并形成输出 xml 并发送到目的地。
我现在面临的问题是,如果整个事情都可以在内存中完成,那么写入两个表并从中获取是过度的。
我正在考虑一种方法,我可以在其中保留 HashTable(google guava (MapMaker)) 类型的缓存,以及我可以指定的大小,一旦缓存达到上限,我可以写将它们放入数据库表中(在放入缓存中编织一个方面)。
以同样的方式检索条目时,我可以先在缓存中检查键,如果不存在,则查询数据库。
您对这种设计方法有什么看法(这是另一个错误还是我可以使其实用且同时稳定且可以扩展的东西)。
为什么我想到这个,我们并不总是有大文件进来,只有当我们无法在内存中处理整个文件并且可能导致 OutOfMemory 问题时,我们才需要这些临时表。
你能不能给点建议?
谢谢
【问题讨论】:
-
为了开发自定义面向方面的解决方案的成本,我敢打赌,您可以购买几台具有足够 RAM 的服务器来处理内存中的 1GB 文件 :) 听起来像是一个基金的想法!
-
写一个方面并没有那么复杂,但是在这种情况下它可能有点矫枉过正,你不能简单地将哈希图包装在你自己的一个类中,在一定数量的“添加”之后刷新到数据库” 并在数据库中搜索“get”是否没有结果并且已经缓存了结果?正如任何缓存或多或少一样:D
-
@SimoneGianni 看到问题是我在其他任何地方都没有见过这样的设计。因此,如果我提出这样的建议,大佬们会因为我现在无法预见的任何其他原因而直接拒绝,还是您认为这是解决手头问题的好方法?
-
@nobody 您基本上是在缓冲对 DB 的写入并缓存从中读取的内容,您“转储”到 DB 的 RAM 上限。我认为,如果你把这件事简单地说出来,没有人会不同意。
标签: java algorithm design-patterns caching batch-file