我有一个应用程序,它接收带有DBF中的平面表的文件,该文件规范并转换并插入到MySQL数据库,这些文件将增长到250,000至270,000条记录,而且现在消耗1.5 -2 Gb左右--我必须重复这个过程,并将其分成几个部分。
如果没有先前的记录,我在HashMaps中检查,帮助那些是唯一记录的键不能保存其中的所有信息,这里的问题是,当上传文件到数据库DBF总记录数据增长,每次您导入的东西变得更慢,消耗更多内存时,很容易在一个表中获得77万条记录,并调用2,000,000条记录中的更多的部分。
示例:
DBF文件有91个字段,我已经规范化了数据库,给出了5个主表,我必须重复记住DBF 5次的过程。
没有什么可以花大约1小时来迁移所有DBF文件的250,000条记录。
如何将时间和内存消耗降到最低,除非内存消耗较低,并且我得到了几个Exception in thread "main" java.lang.OutOfMemoryError: Java heap space。
有许多冗余数据的DBF文件结构如下(列):
示例:
| survey_code | survey_columns | group_survey | more_data | person_details |
|:------------|:---------------|:----------------|:----------|:---------------|
| 1 | ... | 1 | ... |1-oscar |
| 1 | ... | 1 | ... |2-juan |
| 1 | ... | 2 | ... |1-catalina |
| 2 | ... | 1 | ... |7-john |注意:如您所见,有足够的数据冗余
MySQL数据库的结构如下:
Survery (table)
id
survey_data
Group_in_survey (table)
survey_id
group_data
Person (table)
group_id
person_details 根据表及其依赖定义的顺序划分的导入过程(对于每个表)运行在DBF文件中的所有记录中。
在提出启动数据库的请求之前,在将记录添加到HashMap中的数据库之前,加载到执行验证所必需的MySQL信息。
另外,每次向MySQL数据库添加记录时,记录达米宾都会添加到HashMap中,因为其中一个调试过程是重复的。后者是在每个过程中完成的。
发布于 2011-09-30 06:24:33
据我所知,您首先将记录插入到HashMap中,以摆脱重复的记录,然后将其复制到MySQL数据库。如果是这样,您可以尝试使用HugeCollections库及其HugeMap,而不是简单的HashMap。
发布于 2011-09-30 06:28:12
我想我更喜欢处理平面文件,先剥离副本,然后保存到临时文件中,然后执行完整的批量导入。这样,您就不会遇到内存问题,如果有任何问题,您将对第一步进行备份。
发布于 2011-09-30 09:03:28
似乎您正在做一些奇怪的事情,看起来您正在解析整个dbf文件,将其加载到内存中,然后一个一个地插入到数据库中(希望每次都不会创建连接)。
现在,据我所知,dbf很容易被流读取器读取,因此没有必要将所有内容加载到内存中,我认为最好是分批读取100条记录,将所有记录插入数据库,或者您可以使用insert创建sql文件,然后在mysql上运行整个文件(但这会导致hdd空间的大量增加)。
现在,整个进程应该只占用与处理一行相同的内存,这应该是稳定的。
我需要更多地了解dbf文件和表的结构,才能说更多的话。
https://stackoverflow.com/questions/7606558
复制相似问题