小编use*_*356的帖子

磁盘数据库存储,最佳实践

如果这个问题对您来说很常见,我很抱歉,我快速搜索了这个网站并进行了一些谷歌搜索,但找不到令人满意的答案.

我的问题是这个;

我现在只做了3到4年的软件开发人员.这似乎是一个足够长的时间来自己回答这个问题但是在我所有的时间里,我从来没有开发过软件,其中数据存储的主体不需要在在线数据库中.但是,这次,我的最新开发只需要将其数据仅存储到磁盘.

实际数据本身很轻.在代码中,主资产将是一个只有少数基于字符串的属性的类,必须持久化.我最初的想法是简单的序列化.在应用程序关闭时,新资产只是序列化并作为文件存储在磁盘上.我也可能为了备份目的(或者如果它在某种程度上是序列化类的更好选择),XML文件也是合适的.

我无法想到这两种方法中任何一种明显的缺点,正是这一事实让我公开提出这个问题.根据我的经验,很少有一个问题的解决方案没有它的缺点.

c# storage disk local

8
推荐指数
1
解决办法
1919
查看次数

在Java中使用大型XML DOM时减少内存占用

我们的应用程序需要以XML格式(几个文件)呈现客户端数据,并将其解析为我们的通用XML格式(带有模式的单个文件).为此,我们使用apache的XMLBeans数据绑定框架.下面简要描述该过程的步骤.

首先,我们将原始的java.io.File对象指向磁盘上的客户端XML文件,并将它们加载到一个集合中.然后,我们遍历此集合,为每个文件创建一个apache.xmlbeans.XmlObject.在将所有文件解析为XmlObjects之后,我们创建了4个集合,其中包含我们感兴趣的XML文档中的各个对象(要清楚,这些不是手工制作的对象,而是我只能描述为创建的'代理'对象通过apache的XMLBeans框架).最后一步,我们迭代这些集合以生成我们的 XML文档(在内存中),然后将其保存到磁盘.

对于大多数用例,此过程运行正常,并且在给定'-Xmx1500m'命令行参数时可以在JVM中轻松运行.但是,当我们为客户提供"大数据集"时会出现问题.在这种情况下,大型的123Mb客户端XML分布在7个文件中.这样的数据集导致我们的代码内集合中填充了大约40,000个上述"代理对象".在这些情况下,内存使用只是通过屋顶.我没有得到任何outofmemory异常程序只是挂起,直到垃圾收集发生,释放少量内存,然后程序继续,耗尽这个新空间,循环重复.这些解析会话目前需要4-5个小时.我们的目标是在一小时内将其降低.

重要的是要注意将客户端xml转换为xml所需的计算需要所有xml数据进行交叉引用.因此,我们无法实现顺序解析模型或将此流程批处理为较小的块.

到目前为止我尝试过的

不是在内存中保存所有123Mb的客户端xml,而是在每次数据请求时,加载文件,查找数据并释放对这些对象的引用.这似乎可以减少在此过程中消耗的内存量,但是您可以想象,常量I/O所花费的时间消除了减少内存占用的好处.

我怀疑一个问题是我们持有一个价值123Mb的XML文件的XmlObject []以及从这些文件中获取的对象集合(使用xpath查询).为了解决这个问题,我改变了逻辑,以便不是查询这些集合,而是直接查询文档.这里的想法是,在任何时候都不存在4个大量的列表,其中包含10个1000的对象,只是XmlObjects的大集合.这似乎没有任何区别,在某些情况下,甚至会增加内存占用.

现在抓住吸管,我认为在写入磁盘之前我们用来构建我们的 xml内存的XmlObject 变得太大而无法与所有客户端数据一起维护.但是,对此对象执行一些sizeOf查询显示,在此最大的对象上,此对象小于10Kb.在阅读了XmlBeans如何管理大型DOM对象之后,它似乎使用了某种形式的缓冲编写器,因此很好地管理了这个对象.

所以现在我没有想法; 不能使用SAX方法而不是内存密集型DOM方法,因为我们在任何时候都需要100%的客户端数据,在我们绝对需要它之前不能阻止请求这些数据,因为转换过程需要大量的循环和磁盘I/O时间不值得保存的内存空间,我似乎无法以减少内部java集合占用的空间量的方式构造我们的逻辑.我在这里运气不好吗?我必须接受,如果我想将123Mb的xml数据解析成我们的Xml格式,我无法用1500m的内存分配吗?虽然123Mb是我们域中的一个大型数据集,但我无法想象其他人从来没有必须同时使用Gb的数据做类似的事情.

其他可能很重要的信息

  • 我用过JProbe来试试看是否可以告诉我任何有用的东西.虽然我是一个剖析菜鸟,但我浏览了他们的内存泄漏和线程锁定的教程,了解它们并且我们的代码中似乎没有任何泄漏或瓶颈.在使用大型数据集运行应用程序后,我们很快在内存分析屏幕上看到一个"锯刀"类型的形状(参见附图),PS Eden空间被一个巨大的PS Old Gen绿色区块接管.这让我相信这里的问题只是对象集合占用的空间,而不是泄漏到未使用的内存中.

在解析大型数据集期间,JProbe跟踪内存使用情况

  • 我在64位Windows 7平台上运行,但这需要在32位环境下运行.

java memory xml-parsing

6
推荐指数
1
解决办法
4052
查看次数

CVS到Git迁移的具体商业案例是什么?

我被要求证明将小团队从CVS/SVN移到git是合理的.

到目前为止,从我的阅读中,我可以确定三个主要好处:

  • 速度
  • 易分支
  • 分散式
  • SVN不提供的更多功能(部分文件提交,登台等...)

速度

一些支持git的论据是因为它的速度,但是,提及Git优越速度的常见回应是3到13秒之间的差异可以忽略不计.

一个真实的例子:

我白天做了很多工作,晚上回家之前把稳定的东西送到了家里.
在一个大提交中,我已经添加了几百个文件以及更改,移动和重新计算现有文件,CVS将执行提交,然后我可以穿上外套并整理我的桌面.这与git有什么不同?

易分支

Git的分支被许多人称赞为其中一个强项功能.然而,CVS/SVN中的分支对于许多工程师来说似乎已经足够了,特别是对于现代IDE而言,无论实际使用哪种RCS,整个体验和工作流程几乎都是相同的.

当我想尝试一个想法时,我右键单击Eclipse中的项目节点,选择"切换到不同的分支",选择"新建",输入名称,我就离开,提交和更新,而不会"污染主线" CVS显而易见.当我确定此分支中的新想法稳定且良好时,我再次右键单击该项目,选择"与另一个分支或版本合并",选择HEAD,我们又回到了HEAD,但实施了工作变更......会git改善我的经验吗?

真正分配

使用分布式RCS的主要优势似乎是灾难恢复.然而,类似的属性也是CVS和SVN中固有的.对于标准练习用法尤其如此:

现在我认为标准做法是早上做的第一件事就是检查存储库是否有任何变化,如果需要的话,进行更新/合并,如果我今晚回家,发现我的存储库被烧毁了早上地面,我会失去......好吧......没什么.我会创建一个新的repo,将我的本地文件提交给服务器,其他5个员工会做同样的事情,可能会有一些合并大惊小怪但不会超过我们已经将我们的本地更改提交到已经存在的服务器,我们再次离开.没什么大不了.

GIT分期

经常提到的另一个特征是临时区域.这在SVN/CVS中没有等价物,允许开发人员"制定他的提交"以包含在您想要的文件中. 

通常,当提到这一点时,我只想到变更集.临时区域有何不同?


实际上,我甚至看到使用Git的一些缺点:

  • 本地提交意味着丢失代码的可能性更大,因为我的开发机器比我们的SVN服务器更容易受到攻击,并且在将其推送到我们的公共存储库之前,我的工作处于危险之中.
  • 离线工作没有明显的优势,因为大多数开发人员在离线时永远不会在项目上工作.

我觉得好像我必须遗漏或误解git的基本内容,并且很难证明交换机的商业案例.我非常感谢您的投入,以便更好地理解所涉及的问题,特别是如果您能够确定具体的用例,其中git将是一个比CVS/SVN更优越的解决方案,而不仅仅是逐步更好的解决方案?

svn git cvs version-control

0
推荐指数
1
解决办法
910
查看次数

标签 统计

c# ×1

cvs ×1

disk ×1

git ×1

java ×1

local ×1

memory ×1

storage ×1

svn ×1

version-control ×1

xml-parsing ×1