Rick, I don't quite understand what you are asking for. Could you elaborate
further?

-tobias

2011/3/22 Rick Bullotta <rick.bullo...@thingworx.com>

> I'd like to explore this question a bit further.  Does this mean that
> basically there's no way to scale beyond a single thread/CPU for
> disconnected graphs if you have complex graph dependencies (e.g. you cannot
> create disjoint subgraphs)?
>
>
>
> -----Original Message-----
> From: user-boun...@lists.neo4j.org [mailto:user-boun...@lists.neo4j.org]
> On Behalf Of Tobias Ivarsson
> Sent: Saturday, March 19, 2011 5:59 AM
> To: Neo4j user discussions
> Subject: Re: [Neo4j] Fans of Neo4j From Chinese
>
> Neo4j serializes commits. I.e. at most one thread is committing a
> transaction at once.
> For the actual work of building up the data to be committed, Neo4j supports
> multiple concurrent threads.
>
> This fact alone, that there is a single congestion point, means that if an
> application, like in your case, is very write centric, it is unlikely for
> it
> to scale beyond two threads, with one building up the next commit while the
> other is commiting its data. It might scale to a few more threads than that
> if the buildup time is significantly larger than the commit time. It is
> simple time slicing, "only one train can be at the station at once", then
> you have to do the maths on how many "trains can be out on the track"
> during
> that time.
>
> It is also worth keeping in mind, that for CPU bound operation, an
> application doesn't scale much further than the number of CPUs in the
> computer. The threads that are not in commit mode - i.e. the ones that are
> building up the data for their next commit - are CPU bound, and contending
> for the same CPU resources. This means that your application is not going
> to
> scale much further than the number of CPUs in your computer, and few
> desktop/laptop computers have more than 4 CPUs these days, which makes 5
> threads about the most you can squeeze out of it, anything more than that
> is
> just going to add contention, and possibly even slow things down.
>
> Finally, the (CPU bound) threads that create the graph might be contending
> on the same resources. As Peter said. If multiple threads modify the same
> node or relationship, i.e. if they create relationships to the same node
> (the root node for example), they are all going to block on that resource.
> Neo4j only allows one transaction to modify each entity at a time. This
> means that to get maximum concurrency out of your data creation, each
> thread
> should be creating each own disconnected subgraph. And if they have
> connected parts, the connections to the "global data" should be made last
> in
> the transaction (in a predictable order to avoid deadlocks[1]), to maximize
> the time the thread is operational before hitting the
> "congestion point" that is the (potentially) contended data.
>
> Cheers,
> Tobias
>
> [1] Neo4j will detect if a deadlock has occurred and throw a
> DeadlockDetectedException in that case.
>
> 2011/3/18 孤竹 <ho...@foxmail.com>
>
> > hi,
> >
> >
> >   Sorry for disturb you , I am a chinese engineer , Excused for my bad
> > english :) .
> >
> >
> >   Recently, I am learning Neo4j and trying to use it in my project . But
> > When I make a Pressure on neo4j with 5 theads , 10 theads, 20 and 30, I
> > found the nodes inserted to the Neo4J is not change obvious (sometimes
> not
> > change ~ ~! ). Does it not matter with threads ? the kenerl will make it
> > Serial ? Is there any documents or something about The performance of
> Neo4j
> > ? thanks for your help
> >
> >
> >
> >   The program as follows:
> >   I put this function in ExecutorService ,with 5/10/30 threads. then test
> > for the nodes inserted into at same time .(The counts have not changed
> > obviously)
> >
> >
> > Transaction tx = null;
> >                Node before = null;
> >                try {
> >                        for (int i = 0; i < 1000000; i++) {
> >                                if(stop == true){
> >                                        return;
> >                                }
> >                                if (graphDb == null) {
> >                                        return;
> >                                }
> >                                try {
> >                                        if (tx == null) {
> >                                                tx = graphDb.beginTx();
> >                                        }
> >                                        // 引用计数加1
> >                                        writeCount.addAndGet(1);
> >                                        int startNodeString =
> > name.addAndGet(1);
> >                                        Node start =
> > getOrCreateNodeWithOutIndex(""
> >                                                        +
> startNodeString);
> >                                        if (before == null) {
> >                                                // 根节点.哈哈哈 I got U
> >                                                Node root =
> > graphDb.getNodeById(0);
> >
> >  root.createRelationshipTo(start, LEAD);
> >                                        }
> >                                        if (before != null) {
> >
> >  before.createRelationshipTo(start, LOVES);
> >                                        }
> >                                        int endNodeName =
> name.addAndGet(1);
> >                                        Node end =
> > getOrCreateNodeWithOutIndex("" + endNodeName);
> >                                        start.createRelationshipTo(end,
> > KNOWS);
> >                                        before = end;
> >                                        // 每一千次 commit一次
> >                                        if (i % 100 == 0) {
> >                                                tx.success();
> >                                                tx.finish();
> >                                                tx = null;
> >                                        }
> >                                } catch (Exception e) {
> >                                         System.out.println("write : = " +
> > e);
> >                                }
> >                        }
> >                } catch (Exception e) {
> >                } finally {
> >                        tx.finish();
> >                }
> >        }
> >
> --
> Tobias Ivarsson <tobias.ivars...@neotechnology.com>
> Hacker, Neo Technology
> www.neotechnology.com
> Cellphone: +46 706 534857
> _______________________________________________
> Neo4j mailing list
> User@lists.neo4j.org
> https://lists.neo4j.org/mailman/listinfo/user
> _______________________________________________
> Neo4j mailing list
> User@lists.neo4j.org
> https://lists.neo4j.org/mailman/listinfo/user
>



-- 
Tobias Ivarsson <tobias.ivars...@neotechnology.com>
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
_______________________________________________
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user

Reply via email to