Java堆内存异常

时间:2015-01-31 09:40:54

标签: java mongodb heap-memory

我正在从一些csv文件中读取一些大量数据并放入数据库(Mongodb)。但是在阅读了一些文件之后我在java中遇到堆内存错误。我不明白我的程序有什么问题。以下是我的程序 -

 import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileReader;
    import java.io.IOException;
    import java.net.UnknownHostException;
    import java.nio.file.Files;
    import java.nio.file.Paths;
    import java.text.SimpleDateFormat;
    import java.util.Date;

    import com.mongodb.BasicDBObject;
    import com.mongodb.DB;
    import com.mongodb.DBCollection;
    import com.mongodb.DBObject;
    import com.mongodb.MongoClient;
    import com.mongodb.MongoException;
    import com.mongodb.WriteConcern;

    import au.com.bytecode.opencsv.CSVReader;



    public class Csvread {
        MongoClient mongoClient = null;
        DB db = null;
        DBCollection coll =null;
        static Date myDate = new Date();
       public Csvread()

        {

           try {
            mongoClient = new MongoClient("localhost" ,27017);
        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

           db = mongoClient.getDB( "mahout" );

           coll = db.getCollection("data_flowers_all");
            DBObject fields=new BasicDBObject("product_url",1);
            DBObject options=new BasicDBObject("unique",true);
    //      options.put("dropDups", true);
    //
            coll.createIndex(fields,options);
           coll.setWriteConcern(WriteConcern.UNACKNOWLEDGED);
        }

        public static void main(String[] args) {
            String parentPath="/media/bqadmin/D87CFB1B7CFAF35C/flowersjack/csv files";

            File parentFolder = new File(parentPath);

            String[] files = parentFolder.list();

          Csvread cvobj= new Csvread();

           try {
               for(String file : files)
                {
                   System.out.println();
                   System.out.println();
                   System.out.println();
                   System.out.println("files are:" +parentPath+File.separator+file);

                   CSVReader reader = new CSVReader(new FileReader(parentPath+File.separator+file),',','"');



           String [] nextLine;

             try {

                   while ((nextLine = reader.readNext()) != null &&nextLine.length!=0) {


                    Encapsulation encap=new Encapsulation();
    //         System.out.println("product name"+nextLine[1]);
                    encap.setId(nextLine[0]);
                    encap.setProduct_name(nextLine[1]);
                    encap.setProduct_url(nextLine[6]);
                    encap.setProduct_image(nextLine[3]);
                    encap.setProduct_price(nextLine[5]);
                    encap.setProduct_src("www.flowersus.com");
                    encap.setCountry("USA");
                    encap.setDate(myDate);
                    encap.setCategory(nextLine[8]);

                  cvobj.DBConnection(encap);

                  }

                  } catch (IOException e) {
    System.out.println("reading exception");
                 // TODO Auto-generated catch block
                e.printStackTrace();

                   }
             try {
                reader.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                System.out.println("closing reader");
                e.printStackTrace();
            }
            System.out.println("inside forloop");   
                }
               }catch (FileNotFoundException e) {

        // TODO Auto-generated catch block
    System.out.println("filenotfound");
        e.printStackTrace();

        }

        }

        public void DBConnection(Encapsulation enc ) throws IOException{

        try {

        System.out.println("Inside database connectivity");

        BasicDBObject document=new BasicDBObject();

    //  System.out.println("BasicDBObject created");

        document.put("product_id",enc.getId());
    //  System.out.println("product_id is" +enc.getId());

        document.put("product_name",enc.getProduct_name() );
    //  System.out.println("product_name is" +enc.getProduct_name());

        document.put("product_url",enc.getProduct_url());
        System.out.println("product_url is" +enc.getProduct_url());

        document.put("product_img", enc.getProduct_image());
    //  System.out.println("product_img is" +enc.getProduct_image());

        document.put("product_price",enc.getProduct_price());
    //  System.out.println("price is" +enc.getProduct_price());

        document.put("country", "India");
    //    System.out.println("country" +enc.getCountry());

        document.put("date",new SimpleDateFormat("MM-dd-yyyy").format(myDate));

        document.put("category", enc.getCategory());
    //  System.out.println("categoriy is" +enc.getCategory());
    System.out.println(enc);
System.gc();//for clearing the object
        coll.insert(document);
        System.out.println("insertion complete");

        }

        catch (MongoException e) {

    System.out.println("duplicate");
        // TODO Auto-generated catch block

        e.printStackTrace();

        }
        }
    }

在此我称之为System.gc();清除对象...任何人都可以告诉我的程序有什么问题。任何帮助都会非常明显.....

public class Encapsulation {

        private String id;
        private String product_name;
        private String product_url;
        private String product_image;
        private String product_price;
        private String product_src;
        private String country;
        private Date date;
        private String Category;
        public String getId() {
            return id;
        }
        public void setId(String id) {
            this.id = id;
        }
        public String getProduct_name() {
            return product_name;
        }
        public void setProduct_name(String product_name) {
            this.product_name = product_name;
        }
        public String getProduct_url() {
            return product_url;
        }
        public void setProduct_url(String product_url) {
            this.product_url = product_url;
        }
        public String getProduct_image() {
            return product_image;
        }
        public void setProduct_image(String product_image) {
            this.product_image = product_image;
        }


        public String getProduct_price() {
            return product_price;
        }
        public void setProduct_price(String product_price) {
            this.product_price = product_price;
        }
        public String getProduct_src() {
            return product_src;
        }
        public void setProduct_src(String product_src) {
            this.product_src = product_src;
        }
        public String getCountry() {
            return country;
        }
        public void setCountry(String country) {
            this.country = country;
        }
        public Date getDate() {
            return date;
        }
        @Override
        public String toString() {
            return "Encapsulation [id=" + id + ", product_name=" + product_name + ", product_url=" + product_url
                    + ", product_image=" + product_image + ", product_price=" + product_price + ", product_src="
                    + product_src + ", country=" + country + ", date=" + date + ", Category=" + Category + "]";
        }
        public void setDate(Date myDate) {
            this.date = myDate;
        }
        public String getCategory() {
            return Category;
        }
        public void setCategory(String category) {
            Category = category;
        }

    }

请注意:插入数据一段时间后,会出现堆内存问题。

1 个答案:

答案 0 :(得分:0)

我不确定,但它可能是Java-MongoDB驱动程序中的内存泄漏。 解决问题和/或提高代码性能的一种可能方法。使用:

public WriteResult insert(List<DBObject> list)

或任何其他方法,允许一次添加多个数据记录。 (http://api.mongodb.org/java/2.13/

我知道,你会有问题找出,重复的条目是这样的。我在MongoDB中并不是很了解在一次添加多个数据记录时处理重复条目的最佳方法。但在你的情况下,我肯定会尝试这种方法。

第二件事:

执行标准操作以处理堆错误。至少增加堆大小。 我不知道,你的字符串数组有多大,但它可能会让你的小堆爆炸。特别是CSVReader和慢速垃圾收集器的实现不好。

这都是猜测,但是当涉及内存泄漏时,什么不是...... :) 希望它有所帮助。