2010-01-04 31 views
5

Khi cố gắng tải tệp iTunes XML/plist, tôi nhận được "tràn bảng nội bộ". Sau khi Googling, có vẻ như Applescript đã hết bộ nhớ. Các tập tin là 18 meg trên đĩa, vì vậy trong khi ở phía bên lớn của sự vật, nó vẫn nên làm việc trên một máy Mac với 2 hợp đồng biểu diễn.Cách giải quyết "tràn bảng nội bộ" trong Applescript

Tôi làm cách nào để giải quyết vấn đề này?

Rõ ràng, vì nó được tạo bởi iTunes, tôi không thể kiểm soát việc tạo ra nó nhiều.

Cập nhật: Đoạn liên quan:

tell application "System Events" 
    tell property list file (itunes_xml_file as string) 
     tell contents 
      set my_tracks to value of property list item "Tracks" 
      repeat with t in items of my_tracks 
+0

Thật khó để nói vấn đề là gì mà không biết bạn đang sử dụng phương pháp nào để thử tải tệp. Bạn có thể đăng mã bạn đang sử dụng để tải tệp XML không? –

+0

Điều chắc chắn. Tôi sẽ cập nhật. – Bill

Trả lời

2

Tôi đoán rằng AppleScript chỉ đơn giản là không được thực hiện để xử lý lượng dữ liệu này. Tôi đã cố gắng sử dụng AppleScript một thời gian trở lại là tốt và cố gắng làm một cái gì đó tương tự (đọc một thư viện iTunes). Ý định ban đầu của AppleScript là tự động hóa các ứng dụng bằng cách gửi AppleEvents cho chúng - kết hợp với cú pháp lạ của AppleScript, gây nhầm lẫn rất nhiều và làm cho nó khó thực hiện rất nhiều điều đơn giản.

Sau một thời gian bực bội tôi quyết định sử dụng Python thay vào đó, vì nó cung cấp một module đơn giản cho việc đọc các file plist: http://docs.python.org/dev/library/plistlib.html

Có thể không phải những gì bạn muốn nghe, nhưng vấn đề với AppleScript là nó có thể dễ dàng quá tải với dữ liệu, như sự trừu tượng của dữ liệu nó hoạt động với khá cồng kềnh và chiếm rất nhiều bộ nhớ.

Tôi chắc chắn nếu bạn cung cấp cho Python một thử, bạn sẽ có một cái gì đó và chạy trong vòng chưa đầy một giờ. Python được cài đặt trên tất cả các máy Mac theo mặc định và thực sự dễ học.

+0

Ngoài ra, nếu bạn cần phải làm những gì AppleScript làm, bạn có thể sử dụng các mô-đun Python appscript (http://appscript.sourceforge.net/) để làm những điều tương tự từ Python; Tôi đã không sử dụng phiên bản Python, nhưng tôi đã sử dụng phiên bản Ruby, và nó khá tốt. –

+0

Cảm ơn. Nếu không ai thực sự có thể trả lời làm thế nào để làm điều đó theo cách này, tôi sẽ xem xét chuyển sang Python như Kế hoạch B. – Bill

1

phiên bản OS 10.6.8

Cập nhật: Xác nhận tính hợp lệ
Sau bước đầu viết dưới đây tôi đã cố gắng để phục hồi các mã trong tầm tay nhưng không thể sao chép các lỗi và giấu các bài bởi "xóa" nó .
Hiện tại, lỗi xảy ra khi tải một tệp không tồn tại và một đường dẫn tệp hiện có trong tập lệnh phân tích cú pháp tùy chọn được tải bằng lệnh gọi load script, ban đầu được xử lý bởi trình xử lý chạy, được gọi bằng chương trình CLI osascript (1). Lần này nó có thể được phục hồi và tôi cảm thấy tự tin để bỏ "xóa" nó.

Nói tóm lại, giải pháp của tôi là thay đổi anyone_else's POSIX file path_posix để AppleScript's POSIX file path_posix

Một số mối quan hệ
Sau khi viết dưới đây bây giờ tôi nhận ra rằng tôi lần đầu tiên chỉ thấy "iTunes" và bỏ lỡ dòng đầu tiên có liên quan với tell app "system events" và sử dụng nó là property list file mà có lẽ/thực sự/bằng cách nào đó có thể liên quan đến vấn đề của tôi với info for a POSIX file.
Lưu ý liên quan đến OP/câu hỏi: tệp hoặc bí danh as string cung cấp đường dẫn "HFS" được phân tách bằng dấu hai chấm. Sự kiện hệ thống xử lý cả hai.

Vấn đề của tôi
Trong tập lệnh tải tập lệnh, tôi nhận được error "Internal table overflow." number -2707 từ khối bên dưới.
Nó được phát hành khi tôi gọi trình xử lý khối bằng cách sử dụng ~ IPC ~ (app app_name's handler_name()) (khi tôi điều tra kỹ hơn nhưng, tôi đã gặp phải nó trước đây - không có IPC).

try 
    set file_modified_date to (info for my POSIX file file_path_posix)'s modification date 
    true 
on error error_message number error_number from error_source partial result error_result to error_class 
    if {error_number} is not in {-43, -37} then error error_message number error_number from error_source partial result error_result to error_class 
    false 
end try 

A (các (?)) Mẹ (sử dụng cho my) của kịch bản này, đáng nói, là current application (với một số mức ở giữa) (biên soạn và đóng gói trong "AppleScript Editor" để được chạy như một .app độc lập)

giải pháp của tôi
Thay đổi

set file_modified_date to (info for my POSIX file file_path_posix)'s modification date 

để

set file_modified_date to (info for AppleScript's POSIX file file_path_posix)'s modification date 

giải quyết vấn đề - ngay bây giờ.

Suy nghĩ
Tôi đoán ~ module khác nhau ~ có "bảng" khác nhau (không phải bây giờ nhiều C) để xử lý một điều như POSIX fileinfo for (mở "Scripting Addition"/extension (OSAX) " Bổ sung tiêu chuẩn ", vì nó (cả hai) vẫn là, phải không?).

Hy vọng điều này sẽ giúp, và mức độ chi tiết của tôi (và dấu ngoặc đơn) không bị mất hoặc gây nhầm lẫn cho bạn :) Chúc ngủ ngon.

Diggin' 'quanh cái nôi
Khoảng bộ nhớ mộ AS: (phòng ngừa Spam khiến tôi hạ cấp tất cả ngoại trừ 2 siêu liên kết - cho tôi một số đại diện và tôi sẽ sửa chữa nó: p.)
• Các ưu việt ~ có [trên mã lỗi này] (http://lists.apple.com/archives/applescript-users/2005/Jul/msg00166.html) với một nguồn có liên quan nhưng có lẽ khác (và đề cập đến trình tải thư viện của anh) qua danh sách. apple.com.
• Một số [câu hỏi hay] (http://lists.apple.com/archives/applescript-implementors/2005/Jun/msg00104.html), một số câu hỏi dưới đây có thể là một câu trả lời hơi ngáp:
• cs .cmu.edu cung cấp (120625) một số pascal source from 1992 xác định các giới hạn tương tự như /System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/OpenScripting.framework/Versions/A/Headers/AppleScript.h
địa phương của tôi • Và cuối cùng là một vấn đề [liên quan xa hơn với các tập lệnh lớn] (http://macscripter.net/viewtopic.php?id=11760) từ macscripter.net - một diễn đàn tốt về kiến ​​thức và tập hợp các tài nguyên xung quanh bản thảo.

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