3

foreach ループをインクリメントすると、Java がハングしているように見えます。私は同じような問題を抱えている人を見つけることができないので、何か間違ったことをしているのかもしれませんが、それが何であるか想像できません. 私はNeo4Jデータベースから一連のノードを引き出し、それを繰り返し処理しています。ループ中はノードのセットを変更しませんが、しばらくするとハングします。これを行うコードは次のとおりです。

        IndexHits<Node> usrs = users.get("Type", "User");
        System.out.println("Operating on "+usrs.size()+" Users:");

        for (Node u : usrs) {
            System.out.print(".");
            if (inUserBlacklist(u))
                continue;
            System.out.println("HA");
        }

inUserBlacklist(u) が行うことは、事前に設定されたノードのセットに対してノード u をチェックして、ノードがブラックリストの一部であるかどうかを確認することだけです。ノード u については何も変更しません。

ユーザーは Neo4J インデックスであるため、get() を呼び出すと反復可能な IndexHits オブジェクトが返されます。この foreach ループは、foreach ループを 269,938 回実行します。その反復の最後に、「HA」を出力しますが、別の「.」を出力することはありません。反復 269,939 の直前で、その時点でハングします。これにより、foreach ループでブロックされます。合計 270,012 回の反復があるはずです。

ブラックリストには 74 個のアイテムが含まれていることに気付きました。これらはすべて、このループを通過する間に 1 回一致する必要があります。270,012 - 74 = 269,938 ですが、これではブロックされている理由を説明できません。私が把握できるのは、foreach ループが、continue を呼び出したときにカウンターをインクリメントせずにイテレータの位置をインクリメントしていることだけです。その後、セットの最後に到達し、それ以上はありませんが、カウンターは 270,012 のうちの 269,938 にすぎないと考えています。

foreach ループがこのように動作する理由を知っている人はいますか?

編集: スタック トレースは、プロセスが実際に for ループでスタックしていることを示しています (116 行目):

   java.lang.Thread.State: RUNNABLE
       at sun.nio.ch.FileDispatcher.pread0(Native Method)
       at sun.nio.ch.FileDispatcher.pread(FileDispatcher.java:49)
       at sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:248)
       at sun.nio.ch.IOUtil.read(IOUtil.java:224)
       at sun.nio.ch.FileChannelImpl.read(FileChannelImpl.java:663)
       at org.neo4j.kernel.impl.nioneo.store.PersistenceRow.readPosition(PersistenceRow.java:91)
       at org.neo4j.kernel.impl.nioneo.store.PersistenceWindowPool.acquire(PersistenceWindowPool.java:177)
       at org.neo4j.kernel.impl.nioneo.store.CommonAbstractStore.acquireWindow(CommonAbstractStore.java:559)
       at org.neo4j.kernel.impl.nioneo.store.RelationshipStore.getChainRecord(RelationshipStore.java:349)
       at org.neo4j.kernel.impl.nioneo.xa.ReadTransaction.getMoreRelationships(ReadTransaction.java:121)
       at org.neo4j.kernel.impl.nioneo.xa.ReadTransaction.getMoreRelationships(ReadTransaction.java:104)
       at org.neo4j.kernel.impl.persistence.PersistenceManager.getMoreRelationships(PersistenceManager.java:108)
       at org.neo4j.kernel.impl.core.NodeManager.getMoreRelationships(NodeManager.java:666)
       at org.neo4j.kernel.impl.core.NodeImpl.getMoreRelationships(NodeImpl.java:427)
       - locked <0x77c9b4a0> (a org.neo4j.kernel.impl.core.NodeImpl)
       at org.neo4j.kernel.impl.core.IntArrayIterator.fetchNextOrNull(IntArrayIterator.java:91)
       at org.neo4j.kernel.impl.core.IntArrayIterator.fetchNextOrNull(IntArrayIterator.java:36)
       at org.neo4j.helpers.collection.PrefetchingIterator.hasNext(PrefetchingIterator.java:55)
       at org.neo4j.kernel.impl.traversal.TraversalBranchImpl.next(TraversalBranchImpl.java:128)
       at org.neo4j.kernel.PreorderBreadthFirstSelector.next(PreorderBreadthFirstSelector.java:48)
       at org.neo4j.kernel.impl.traversal.TraverserImpl$TraverserIterator.fetchNextOrNull(TraverserImpl.java:127)
       at org.neo4j.kernel.impl.traversal.TraverserImpl$TraverserIterator.fetchNextOrNull(TraverserImpl.java:94)
       at org.neo4j.helpers.collection.PrefetchingIterator.hasNext(PrefetchingIterator.java:55)
       at org.neo4j.helpers.collection.IteratorWrapper.hasNext(IteratorWrapper.java:42)
       at NodePlacement.LoadFromNode(NodePlacement.java:116)

そのため...スレッドはまだ実行されており、何もブロックされていないようです。それでも、コードのこのセクションから抜け出すことはできません。データベースのセットアップに関する何かが原因で、データベースが無限ループに陥ったのではないでしょうか?

4

3 に答える 3

0

何が起こっているのか正確にはわかりませんでしたが、Neo4Jデータベースのディスクアクセスで問題が発生しているように見えました。戻って作成方法を見てみると、データベースの作成方法に重大な間違いがあったことに気づきました。すべてを再構築しましたが、現在問題は発生していません。みなさん、ありがとうございました!

于 2012-05-15T17:52:52.653 に答える
0

ハングした場合は、コマンド ラインから Ctrl-Break を使用するか、デバッガーで実行している場合は実行を中断するか、jps および jstack ツールを使用してアプリケーションのスレッド ダンプを取得し、どのメソッドが実行されているかを確認します。

余談ですが、foreach ループが行うことはIterator、コレクションまたは配列からインスタンスを取得し、 IterableIterator の hasNext() および next() メソッドを使用することだけです。したがって、これらのメソッドのいずれかがハングした場合、現在表示されているものが得られます。

于 2012-05-11T17:17:10.150 に答える
0

私は手足に出て、問題がループの後のコードにあることを提案します。書かれているように、コードはエントリを除くすべてのエントリに対してinUserBlacklist()「HA」を出力します..「HA」出力行のプログラムによるカウントに基づいている場合、指定したカウントは、コードがループを終了して続行したことを示しますあなたが提供していない他のものに。

于 2012-05-11T18:18:01.657 に答える