ArcGIS Python SearchCursor blokowanie plików?


11

Mam skrypt, który pobiera wartość z pola pliku kształtu, aby zwrócić użytkownikowi.

Wydaje się, że tylko wtedy, gdy arcpy.SearchCursor nazywa się ArcMap 10.0, blokuje plik i nie można go usunąć po zakończeniu działania skryptu. Aby wyłączyć blokadę, muszę zamknąć ArcMap. W skrypcie usuwam obiekt SearchCursor po jego użyciu, a także obiekt wiersza.

Skrypt działa tak, że próbuje usunąć folder obszaru roboczego przy kolejnych uruchomieniach, ale nie może z powodu blokady ... dopóki oczywiście nie zamknę ArcMap.

Czy jest jakaś rada na temat odejścia tego zamka?

Odpowiedzi:


4

problem został rozwiązany po przejściu z:

rows = arcpy.UpdateCursor(fc)   
delete = rows.deleteRow  
for row in rows:  
    delete(row)  
del row  
del rows

do

rows = arcpy.UpdateCursor(fc)
for row in rows:
    rows.deleteRow(row)
del row
del rows

3

Zobacz Nie można pozbyć się blokady na geobazie pliku i klasie obiektów utworzonych w skrypcie Python . Wygląda na ten sam problem. Ominąłem się już wcześniej, wyraźnie usuwając klasę obiektów. Nie jestem pewien, czy to zadziała we wszystkich przypadkach.

import arcpy

fcPath = 'c:/temp/features.shp'
idFld = 'OBJECTID'
cur = arcpy.SearchCursor(fcPath)
for row in cur:
    id = row.getValue(idFld)
    row = None
cur = None
r = arcpy.Delete_management(fcPath)

print r.getOutput(0)

Wymuszanie wyrzucania elementów bezużytecznych może również działać, ale mam przeczucie, że ma to coś wspólnego z wewnętrznym działaniem arcpy lub ArcMap.

import gc
gc.collect()

Zredagowałem to, ponieważ odwołanie do wiersza powinno być usuwane po każdej iteracji kursora, w przeciwnym razie wywołanie poza pętlą jest zbędne. Głosowałem również za tym, ponieważ to jedyny sposób, w jaki mogłem poradzić sobie z tym samym problemem, kiedy go miałem.
— Hairy

@ Mleczarstwo OK, ale myślę, że to niemy. Python zmniejsza odniesienia do poprzedniego obiektu wiersza podczas każdej iteracji, gdy nowy obiekt wiersza jest przypisany do zmiennej wiersza . row = Nonepo pętli po prostu czyści ostatnie przypisanie wiersza. Przenoszenie go w pętli jest powielaniem wysiłku. W każdym razie śmieciarz powinien cofnąć przydział pamięci, chyba że arcpy lub ArcMap wewnętrznie zachowuje odniesienie do obiektów wiersza.
— tharen

zgadza się nie zgadzać, lub jest to kwestia sporna. Wiem, że zbieranie śmieci w arcpy jest wadliwe i jest o wiele szybsze, jeśli je wyłączysz. Co do wiersza ustawionego na nic w wierszu, wiem, że działa lepiej. Niektórzy twierdzą, że ustawienie czegokolwiek na nic nie jest zbędne, ale tak nie jest. Spróbuj wyłączyć zbieranie śmieci na początku skryptu i zmierz różnice czasowe. Używam też del row, nie row = none, ale to kolejna dyskusja: spróbuj zaimportować gc gc.disable ()
— Hairy

@ Mleczko, nie przyszło mi do głowy, aby wyłączyć gc. Dam temu szansę.
— tharen

To nie działa dla mnie, ponieważ potrzebuję klasy funkcji. Później otrzymuję UpdateCursor w innej klasie funkcji i to również zostaje zablokowane. Skończyło się na użyciu luster i sztuczek, aby dostać się tam, gdzie muszę być. Nie jestem pewien, jak długo to wytrzyma. Dzięki.
— Justin

1

Czy potrzebujesz uruchomić skrypt ArcPy z poziomu ArcMap? O ile nie jest to część wbudowanego interfejsu lub zestawu narzędzi, możesz go uruchomić poza ArcMap z konsoli Python, IDLE, Eclipse itp. (O ile masz odpowiednią licencję na maszynę, na której jest uruchomiony). W takim przypadku możesz napisać mały kod Python, aby spawnować skrypt ArcPy jako podproces, a blokada powinna zostać zwolniona po zamknięciu podprocesu.

Zamki ArcGIS są uciążliwe. Miałem sytuacje, w których zamek utrzymuje się nawet po wyłączeniu maszyny, co jest ogromnym bólem (zwykle, gdy Arc rozbił się, zanim mógł uporządkować zamki). W ostateczności, jeśli tak się stanie, użyj Eksploratora Windows, aby znaleźć plik .LOCK i usunąć go ręcznie. To nie zadziała, jeśli jest uzyskiwany przez ArcMap lub proces Pythona, więc jest względnie bezpieczny ... ale to naprawdę karta Get-Out-of-Jail i nie jest dobrą praktyką :)


1

Jeśli prawidłowo usuwasz zarówno obiekty wiersza, jak i kursora (np. del row, rows), A blokada pozostaje, prawdopodobnie jest to spowodowane tym, że sama ArcMap, a nie arcpy, nadal się do niej odwołuje.

Czy plik kształtu jest przywoływany przez warstwę w spisie treści, czy też jest dodawany do spisu treści za pomocą narzędzia skryptowego?

Jeśli to drugie, możesz spróbować wyłączyć opcję „Dodaj wyniki operacji geoprzetwarzania do wyświetlacza” w obszarze Geoprocessing- > Opcje geoprzetwarzania w ArcMap.

Dodatkowa sugestia: jeśli robisz to jako tymczasowy / pośredni zestaw danych, a liczba funkcji nie jest zbyt duża, spróbuj użyć in_memoryobszaru roboczego zamiast pliku kształtu, aby całkowicie obejść problem z blokowaniem i uzyskać miły potencjalny wzrost wydajności .

Pamiętaj tylko o usunięciu obszaru roboczego in_memory lub określonych zestawów danych, które tam utworzysz za pomocą Delete (zarządzanie danymi) przed wyjściem ze skryptu, w przeciwnym razie pozostanie on w pamięci aż do zamknięcia aplikacji.

Na koniec chciałbym również zauważyć, że zachowanie blokowania plików kształtu zmieniło się w 10.0, aby stało się bardziej surowe, nie usuwając plików blokujących po usunięciu warstwy ze spisu treści. Zobacz także ten artykuł i powiązane pytanie .


To zdecydowanie ArcMap. Myślę, że wywołanie kursora zabija poprzednią blokadę kursorów. Nazywam SearchCursor na fc .. następnie UpdateCursor na innym fc i poprzednia blokada znika. Mogę wywołać trzeci manekin kursor na pliku, którego nie trzeba będzie usuwać tylko po to, aby obsłużyć styl blokujący czarne skrzynki. Dzięki.
— Justin
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.