2011-02-09 27 views
7

Tôi có một ứng dụng Rails sử dụng delay_job trong một tính năng báo cáo để chạy một số báo cáo rất lớn. Một trong số đó tạo ra một tệp XML khổng lồ và có thể mất nhiều ngày theo cách cũ, mã cũ được viết. Tôi nghĩ rằng, khi thấy điểm chuẩn ấn tượng trên internet, Nokogiri có thể đủ khả năng cho chúng tôi một số lợi ích hiệu suất phi thường.Làm cách nào để sử dụng Nokogiri để viết một tệp XML HUGE?

Tuy nhiên, các ví dụ duy nhất tôi có thể tìm thấy liên quan đến việc sử dụng Trình tạo Nokogiri để tạo đối tượng xml, sau đó sử dụng .to_xml để viết toàn bộ nội dung. Nhưng không có đủ bộ nhớ trong mã zip của tôi để xử lý cho một tệp có kích thước này.

Vì vậy, tôi có thể sử dụng Nokogiri để truyền hoặc ghi dữ liệu này ra tệp?

+3

Mức độ lớn là bao nhiêu? –

+0

thường chuỗi nối là đủ cho nhiều tác vụ viết xml, tránh xây dựng một cây bất cứ khi nào bạn có thể ... –

+0

Chuỗi nối được lấy mãi mãi. Người xây dựng cũ thường xuyên đã cho thấy sự cải thiện. Tệp có thể lớn hơn gigabyte. – AKWF

Trả lời

4

Nokogiri được thiết kế để xây dựng trong bộ nhớ vì bạn xây dựng một DOM và nó chuyển đổi nó thành XML một cách nhanh chóng. Nó rất dễ sử dụng, nhưng có sự cân bằng, và thực hiện nó trong bộ nhớ là một trong số đó.

Bạn có thể muốn xem xét sử dụng Erubis để tạo XML. Thay vì thu thập tất cả dữ liệu trước khi xử lý và giữ logic trong một bộ điều khiển, giống như chúng ta làm với Rails, để tiết kiệm bộ nhớ, bạn có thể đặt logic của mình vào mẫu và lặp lại dữ liệu của bạn. .

Nếu bạn cần XML trong một tập tin mà bạn có thể cần phải làm điều đó bằng chuyển hướng:

erubis options templatefile.erb > xmlfile 

Đây là một ví dụ rất đơn giản, nhưng nó cho thấy bạn có thể dễ dàng xác định một mẫu để tạo ra XML:

<% 
asdf = (1..5).to_a 
%> 
<xml> 
    <element> 
<% asdf.each do |i| %> 
    <subelement><%= i %></subelement> 
<% end %> 
    </element> 
</xml> 

đó, khi tôi gọi erubis test.erb kết quả đầu ra:

<xml> 
    <element> 
    <subelement>1</subelement> 
    <subelement>2</subelement> 
    <subelement>3</subelement> 
    <subelement>4</subelement> 
    <subelement>5</subelement> 
    </element> 
</xml> 

EDIT:

Chuỗi nối được dùng mãi mãi ...

Vâng, nó có thể chỉ đơn giản là vì thu gom rác thải. Bạn không hiển thị bất kỳ ví dụ mã nào về cách bạn đang xây dựng các chuỗi của mình, nhưng Ruby hoạt động tốt hơn khi bạn sử dụng << để nối thêm một chuỗi với một chuỗi khác với khi sử dụng +.

Nó cũng có thể làm việc tốt hơn để không cố gắng giữ mọi thứ trong một chuỗi, nhưng thay vào đó để ghi nó ngay lập tức vào đĩa, gắn thêm vào một tệp mở khi bạn đi.

Một lần nữa, không có mã ví dụ tôi đang chụp trong bóng tối về những gì bạn có thể đang làm hoặc tại sao mọi thứ chạy chậm.

+0

Chụp tối của bạn là chính xác, Lực mạnh mẽ với cái này. Mã này thực sự cho một báo cáo ruby ​​nằm trong lib, và tôi thấy rằng Builder, mà viết cho một đối tượng io trên bay, đã cải thiện hiệu suất mạnh mẽ. Cảm ơn! – AKWF

+0

Ah. Vui mừng nó đã giúp. Chỉ cần không chạy ra khỏi đĩa hoặc nó sẽ chạy vô cùng chậm. –

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