Hi, 
problem seems to be in the approach. In general you should favor streaming 
over memory loading. 
Loading 3 million features in memory, then commiting them all at once is time 
and resource consuming for sure.

I've tried the following modified version of your code over a postgis database 
in a 100Mb/s lan, with a throughput of ~880 Features/second (so it would take 
about 50+ minutes to complete), but its consuming a reasonable 30% CPU and a 
despreciable ammount of RAM.

Gabriel.


public class Main {

    private DataStore datastore;

    Main() {
    }

    public static void main(String[] args) {
        Main main = new Main();
        try {
            main.createDataStore();
            main.populateDB();
        } catch (Exception e) {
            e.printStackTrace();
            System.exit(-1);
        }
    }

    private void populateDB() throws Exception {
        FeatureType ftPatch = createFeatureType();
        datastore.createSchema(ftPatch);

        // instances
        final GeometryFactory gf = new GeometryFactory();
        final int NUM_FEATURES = 3000000;

        Transaction transaction = new DefaultTransaction();
        FeatureWriter featureWriter = 
datastore.getFeatureWriterAppend("patches", transaction);

        Feature tempF = null;
        Point locGeom = null;
        long totalTime = System.currentTimeMillis();

        // after how many inserts make a commit?
        final int commitInterval = 10000;
        try {
            for (int i = 0; i < NUM_FEATURES; i++) {
                tempF = featureWriter.next();

                locGeom = gf.createPoint(new Coordinate(i, i));
                tempF.setAttribute("width", new Integer(i));
                tempF.setAttribute("location", locGeom);
                tempF.setAttribute("elevation", new Integer(2 * i));

                featureWriter.write();

                if (i % commitInterval == 0) {
                    System.out.println("commiting " + commitInterval + " 
features ("
                            + (1 + (i / commitInterval) * commitInterval) + " 
to "
                            + (((i / commitInterval) * commitInterval) + 
commitInterval) + ")");
                    transaction.commit();
                }
            }
            transaction.commit();
            totalTime = System.currentTimeMillis() - totalTime;
        } finally {
            featureWriter.close();
        }
        System.out.println(NUM_FEATURES + " inserted in " + totalTime + "ms");
        System.out.println("Avg. throughput: " + (NUM_FEATURES / (totalTime / 
1000))
                + " Features/s");
    }

    private FeatureType createFeatureType() throws SchemaException {
        AttributeType pWidth = AttributeTypeFactory.newAttributeType("width", 
Integer.class);
        GeometryAttributeType pLoc =

        (GeometryAttributeType) 
AttributeTypeFactory.newAttributeType("location", Point.class);
        AttributeType pElevation = AttributeTypeFactory
                .newAttributeType("elevation", Integer.class);
        FeatureType ftPatch = FeatureTypeFactory.newFeatureType(new 
AttributeType[] { pWidth, pLoc,
                pElevation }, "patches");
        return ftPatch;
    }

    private void createDataStore() throws IOException {
        Map<String, String> params = new HashMap<String, String>();
        params.put("dbtype", "postgis");
        params.put("host", "axolote");
        params.put("port", "5432");
        params.put("database", "udig_sample");
        params.put("user", "postgres");
        params.put("passwd", "****");
        params.put("wkb enabled", "true");

        this.datastore = DataStoreFinder.getDataStore(params);
        System.out.println("DataStore created!");
    }

}

On Wednesday 14 March 2007 21:22, [EMAIL PROTECTED] wrote:
> Hi,
>
> Using geotools2 v2.4-M0, in kubuntu edgy, I was able to insert
> dynamically features into a mysql database. I will send  the code for
> those who also need to do it.
> For testing purposes I am using only one FeatureType, and I will store
> 3000000 objects (3000000 rows in the mysql table). This is where I have
> problems again...
> My computer, a centrino dothan 1.6 with 1GB ram, has been working for
> about one hour, then I killed the process and inspected my database.
> There were only about 10000 rows inserted.
> Does anyone worked with a db system and geotools with such a large
> number of objects? The problem comes from mysql or from geotools?
> Otherwise, is it my computer?
>
> Thanks,
> Rui Lopes
>
>
> CODE:
>
> public class Main {
>
>       private MySQLDataStore datastore;
>
>       Main(){}
>
>       public static void main(String[] args) {
>               // TODO Auto-generated method stub
>               Main main = new Main();
>               main.createDataStore();
>               main.populateDB();
>       }
>
>       private void populateDB() {
>               AttributeType pWidth = 
> AttributeTypeFactory.newAttributeType("width",
> Integer.class);
>               GeometryAttributeType pLoc =
>
> (GeometryAttributeType)AttributeTypeFactory.newAttributeType("location",
> Point.class);
>               AttributeType pElevation =
> AttributeTypeFactory.newAttributeType("elevation", Integer.class);
>               try {
>                       FeatureType ftPatch = FeatureTypeFactory.newFeatureType(
>                                       new AttributeType[] { pWidth, pLoc, 
> pElevation  }, "patches");
>
> //                     instances
>                       DefaultFeatureCollection fcol = new
> DefaultFeatureCollection("patches", ftPatch);
>                       Feature tempF = null;
>                       GeometryFactory gf = new GeometryFactory();
>                       Point locGeom = null;
>                       for(int i = 1 ;i == 1 ;i++ /*i < patches.length; i++*/)
>                               for(int j = 0 ; j < patches[0].length; j++){
>
>                                       locGeom = gf.createPoint( new 
> Coordinate(i,j));
>                                       tempF = ftPatch.create(new Object[] { 1 
> ,locGeom, i+j },
>                                       "Patch-"+i+"-"+j);                      
>                 fcol.add(tempF);
>                               }
>
>                       JDBCFeatureSource fsrcPatches =
> (JDBCFeatureSource)datastore.getFeatureSource("patches");
>                       JDBCFeatureStore fsPatches = new
> JDBCFeatureStore(fsrcPatches.getJDBCDataStore(), ftPatch );
>                       //FeatureReader aReader = DataUtilities.reader( altemp 
> );
>                       fsPatches.addFeatures( fcol );
>
>               } catch (FactoryConfigurationError e) {
>                       // TODO Auto-generated catch block
>                       e.printStackTrace();
>               } catch (SchemaException e) {
>                       // TODO Auto-generated catch block
>                       e.printStackTrace();
>               } catch (IllegalAttributeException e) {
>                       // TODO Auto-generated catch block
>                       e.printStackTrace();
>               } catch (IOException e) {
>                       // TODO Auto-generated catch block
>                       e.printStackTrace();
>               }
>
>
>
>
>       }
>
>       private void createDataStore() {
>
>               MySQLDataStoreFactory factory = new MySQLDataStoreFactory();
>               Map<String,String> params = new HashMap<String,String>();
>               params.put( "database", "mater" );
>               params.put( "dbtype", "mysql");
>               params.put( "host", "localhost");
>               params.put( "port", "3306");
>               params.put( "user", "ruya");
>               params.put( "passwd", "");
>
>               try {
>                       this.datastore = (MySQLDataStore) 
> factory.createDataStore( params );
>               } catch (IOException e) {
>                       // TODO Auto-generated catch block
>                       e.printStackTrace();
>               }
>               System.out.println("DataStore created!");
>       }
>
>       private void loadGISData( Patch[][] patches ) {
>               loadTopo( patches, _TOPO_PATH );
>               loadHidro( patches, _HIDRO_PATH );
>               /*
>               for( int i = 0 ; i < getWorldXSize(); i++ ){
>                       for( int j = 0 ; j < getWorldYSize(); j++ ){
>                               //patches[i][j].setAgentCapacity();
>                               space.putObjectAt( i , j , patches[i][j] );
>                       }
>               }
>               */
>       }
>
> ----------------------------------------------------------------
> This message was sent using IMP, the Internet Messaging Program.
>
>
> -------------------------------------------------------------------------
> Take Surveys. Earn Cash. Influence the Future of IT
> Join SourceForge.net's Techsay panel and you'll get the chance to share
> your opinions on IT & business topics through brief surveys-and earn cash
> http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
> _______________________________________________
> Geotools-gt2-users mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/geotools-gt2-users

-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys-and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
Geotools-gt2-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/geotools-gt2-users

Reply via email to