python.multiprocessing và LẠC R FAT RÀNG (INFADI) SỨ MỆNH GIÁM ĐỐC


9

Trong khi cố gắng thực hiện đa xử lý với arcpy, tôi thỉnh thoảng gặp phải lỗi này:

FATAL ERROR (INFADI)
MISSING DIRECTORY

Tôi không biết cái gì gây ra lỗi này và nó làm hỏng quá trình python, khiến nó không thể có được một dấu vết trên nó. Nó xảy ra trong khi viết đầu ra raster cuối cùng từ một mô hình âm thanh dài.

Nó đôi khi đi kèm với một lỗi

Unable to write BND file for %TEMP%\ras####

Trong đó% Temp được phân tích cú pháp chính xác và #### là một số gồm 4 chữ số ngẫu nhiên. Điều này là bất thường bởi vì mỗi quá trình có không gian làm việc riêng, đó là nơi mà hầu hết các tệp nên được viết.

Vấn đề không phải là dữ liệu đầu vào ... Tôi có thể chạy lại chương trình trên các đầu vào bị lỗi và nó sẽ chạy chính xác.


Tôi sẽ quay lại cái này sớm thôi, nhưng phải làm việc trên một mô hình khác ngay bây giờ.
blord-castillo

Câu trả lời:


6

Dưới đây là một số điều cần kiểm tra:

Bạn đang sử dụng con trỏ? Bạn đang phát hành chúng? Bạn đang cố gắng sử dụng lại bất kỳ đối tượng trong các quy trình khác nhau? Bạn đang chia sẻ cùng một vị trí tạm thời? Bạn đang làm trong xử lý bộ nhớ?

Nói chung, arcpy chỉ là một trình bao bọc xung quanh các đối tượng com và bất kỳ loại đa xử lý nào cũng sẽ khó khăn.


4

Tôi thấy vấn đề này phát sinh khi arcpy.env.workspace và arcpy.env.scratchWorkspace giống nhau cho hai quy trình khác nhau. Arc ghi gần như tất cả các trình quét trung gian vào không gian làm việc (hoặc không gian làm việc đầu) ở định dạng ESRI GRID. Bạn không thể viết hai trình quét ESRI GRID vào cùng một thư mục cùng một lúc do cấu trúc cơ sở dữ liệu giả định dạng (thư mục thông tin chứa các khóa duy nhất cho mỗi raster).

Tôi đã tránh được lỗi này bằng cách gán không gian làm việc duy nhất và ScratchWorkspace cho mỗi quy trình bằng thư mục tempfile.mkdtemp tạm thời.


Tôi đã sử dụng các không gian làm việc độc đáo, nhưng tôi sẽ nhân đôi rằng ScratchWorkspace cũng là duy nhất. Tôi đoán là không vì nó đang ghi vào thư mục% TEMP%.
blord-castillo

Giô-na là đúng. Tôi đang xử lý hàng ngàn trình quét trong một thư mục trên 5 luồng đồng thời; thiết lập một không gian làm việc độc đáo cho mỗi người là giải pháp duy nhất có hiệu quả với tôi. Xuất ra các thư mục duy nhất, như một số người đã khuyến nghị, chỉ cần tạo thêm công việc cho sau này ... cuối cùng tôi muốn tất cả chúng trong cùng một thư mục.
Tom

Thật là một nỗi đau ở phía sau! Sử dụng không gian làm việc đầu độc đáo với đa xử lý đã hoạt động, nhưng chúa ơi, quản lý các thư mục bổ sung và sau đó cố gắng xóa chúng bằng các khóa hồ quang là vô lý !!
D_C

3

Tôi cũng đã gặp phải điều này và vẫn chưa tìm thấy cách khắc phục âm thanh. Công việc của tôi là 1) để đảm bảo rằng tác vụ đa xử lý đủ mạnh để kiểm tra xem các tác vụ đã hoàn thành hay chưa, sau đó tạo một danh sách công việc mới. 2) lên lịch hai kịch bản để khởi chạy cứ sau 10 - 15 phút. Một tập lệnh chứa lệnh để giết các tiến trình python đang chọn và lệnh thứ hai khởi chạy lại tập lệnh đa xử lý mong muốn. Về cơ bản, điều này làm mới nhóm đa xử lý. Kịch bản kill là như thế này:

def read_pid():
    inFile = open("E:/temp/pid.csv")
    for line in inFile:
        pid = str(line)
    inFile.close()
    return pid

def kill():
    if os.path.exists("E:/temp/pid.csv")==True:
        pid = read_pid()
        PROCESS_TERMINATE=1
        handle = ctypes.windll.kernel32.OpenProcess(PROCESS_TERMINATE,False,pid)
        ctypes.windll.kernel32.TerminateProcess(handle,-1)
        ctypes.windll.kernel32.CloseHandle(handle)
    else:
        return

Mỗi lần khởi chạy của tập lệnh mong muốn, tôi sẽ ghi nó vào một csv.


3

Tôi phải thừa nhận rằng tôi đang ở thời điểm này, chỉ là một Wannabee đa luồng, nhưng một blog tại https: // pythongisand ware.wordpress.com/2013/07/31/USE-arcpy-with-multiprocessing-%E2%80%93-part -3 / gợi ý rằng tích hợp arcpy.Exists()chức năng là chìa khóa để thực hiện.


2

Tôi thấy rằng tôi đã nhận được lỗi INFADI khi thử có nhiều luồng / lõi lưu và sửa đổi các trình quét trong một thư mục. Việc chỉ định một thư mục con cho mỗi tác vụ cho đầu ra dường như để giải quyết vấn đề. Tôi tin rằng vấn đề đã xảy ra với nhiều lần đọc / ghi vào các tệp ngoại vi được liên kết với raster (ví dụ: thư mục "thông tin"). Bây giờ tôi cũng sử dụng các biện pháp phòng ngừa sau:

import arcpy,multiprocessing,random

def run(foo,c):
    tempFolder = os.path.join("Z:/temp/",'temp_%s'%(str(c)))
    if not os.path.exists(tempFolder): os.mkdir(tempFolder)
    arcpy.env.scratchWorkspace = tempFolder
    arcpy.env.Workspace = tempFolder

    # create unique object in memory, run task, then delete unique object in memory
    tempMem = str(rnd)
    try:arcpy.Delete_management(tempMem)
    except:pass

    <tasks> #output to appropriate subfolder

    arcpy.Delete_management(tempMem)

if __name__ == '__main__':
    cores = 3
    pool = multiprocessing.Pool(cores)
    count = 0
    for foo in bar:
        pool.apply_async(run,(foo,c))
        count +=1
    pool.close()
    pool.join()

Tôi dường như không bao giờ gặp lỗi khi viết nhiều GRID vào cùng một thư mục thông qua nhiều luồng. Vấn đề duy nhất dường như là làm như vậy làm chậm quá trình xử lý và hầu như vô hiệu hóa luồng, vì nó chỉ viết một raster mỗi lần.
Tom
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.