2012-05-23 19 views
6

Chương trình python của tôi chuẩn bị đầu vào, chạy mã FORTRAN bên ngoài và xử lý các kết quả đầu ra trong môi trường Windows HPC 2008. Nó hoạt động rất tốt, trừ khi mã thực hiện chương trình bên ngoài từ 1042-1045 lần (Thông thường vấn đề hội tụ trước đó). Trong những tình huống này, tôi nhận được một ngoại lệ:"WindowsError: [Error 206] Tên tệp hoặc phần mở rộng quá dài" sau khi chạy chương trình rất nhiều lần với subprocess

WindowsError: [Error 206] The filename or extension is too long

Tuy nhiên, đường dẫn đến tên tập tin là không ngày càng tăng theo thời gian. Nó chỉ làm sạch thư mục và chạy lại.

Dưới đây là các mã:

inpF = open(inName) 
outF = open(localOutName,'w') 
p = subprocess.Popen(pathToExe,shell=False,stdin=inpF,stdout=outF,cwd=runPath) 
stdout, stderr = p.communicate() 
outF.close() 
inpF.close() 

pathToExe là một chuỗi liên tục trỏ đến một vị trí UNC (ví dụ \\ server \ chia sẻ \ program.exe), stdin là một tập tin mở trong chế độ read-only trên ổ đĩa cục bộ, stdout là một tệp mở trong chế độ ghi trên ổ đĩa cục bộ và cwd là một đường dẫn cục bộ trên ổ C: \. Tôi đã xác nhận rằng không có đối số nào cho quy trình con dài hơn 80 ký tự, mặc dù giới hạn được cho là 32,768, theo số this somewhat related post.

Tôi đang làm gì sai? Bằng cách nào đó một cái gì đó đang tích lũy mà chỉ trở thành một vấn đề khi tôi chạy hơn một ngàn lần.

UPDATE:

Để kiểm tra "quá nhiều tập tin mở" giả thuyết, tôi đã thực hiện một ví dụ rất nhỏ mà chạy rất nhanh chóng với một thực thi khác nhau. Sự khác biệt chính ở đây là stdin và stdout chỉ là các tệp rỗng ở đây, trong khi trong trường hợp trước, chúng đều là các tệp lớn. Trong trường hợp này, mã chạy tốt cho 2000 lần chạy, trong khi mã lỗi trước đó là ~ 1042. Vì vậy, nó không chỉ là có nhiều tập tin. Có thể có quá nhiều tệp lớn đang mở?

import subprocess 
for i in range(nRuns): 
    if not (i % (nRuns/10.0)): 
     print('{0:.2}% complete'.format(i/float(nRuns)*100)) 
    inpF=open('in.txt') 
    outF=open('out.txt','w') 
    p = subprocess.Popen('isotxsmerge.exe',shell=False,stdin=inpF, 
           stdout=outF,cwd='.') 
    stdout, stderr = p.communicate() 
    outF.close() 
    inpF.close() 

Trả lời

4

hmmm .... thực sự, tôi cho rằng văn bản thông báo lỗi là cá trích đỏ. Tôi không biết chắc chắn, nhưng có vẻ như với tôi rằng những gì đang xảy ra là bạn đang hết tập tin. Từ nhiều nguồn khác nhau, có vẻ như giới hạn xử lý tệp chuẩn là khoảng 2048 tệp ... mà tò mò trong vùng lân cận của 2 x 1042 quy trình con của bạn. Tôi không biết bên trong của cửa sổ thông dịch python, nhưng tôi đoán là tay cầm không phải là rác thu thập đủ nhanh, ngay cả khi bạn đóng các tập tin. Một lần nữa ... đây chỉ là một đoán ... nhưng có lẽ đó là một dòng suy nghĩ có thể dẫn bạn đến một cái gì đó kết luận và hiệu quả hơn.

Đồng thời, khi làm việc xung quanh, bạn có thể sử dụng phương pháp tiếp cận độc lập cũ bằng cách có quy trình thống đốc sinh ra một quy trình, để lần lượt sinh ra các quy trình con. Tiến trình con trung gian có tuổi thọ xác định (nói ... không quá 1000 quy trình con mà nó sinh ra) trước khi nó chết. Khi quá trình con trung gian hết hạn, quá trình thống đốc bắt đầu một quy trình mới. Đây là một hack ... và một vụng về ở đó ... nhưng nó hoạt động. (IIRC, máy chủ web apache được sử dụng để có một số loại giới hạn tự hủy đối với số lượng yêu cầu mà một tiến trình con có thể xử lý.)

Dù sao ... tốt nhất là mã may mắn và hạnh phúc.

+0

Cảm ơn. Tôi cá là anh đúng là cá trích đỏ. Tôi đã thử nghiệm giả thuyết về số lượng tệp (xem cập nhật ở trên) và không thể tạo lại vấn đề với stdin/stdouts rỗng đơn giản. Không thực sự kết luận. – partofthething

Các vấn đề liên quan