sitemapper
1.0.0
Sitemapper เป็นไลบรารี Elixir สำหรับสร้าง XML Sitemap
ได้รับการออกแบบมาเพื่อสร้างแผนผังไซต์ขนาดใหญ่ในขณะที่ยังคงรักษาโปรไฟล์หน่วยความจำเหลือน้อย โดยสามารถคงแผนผังไซต์ไว้ที่ Amazon S3, GCP Storage, ดิสก์ หรืออะแดปเตอร์อื่นๆ ที่คุณต้องการเขียน
def deps do
[
{ :sitemapper , "~> 0.8" }
]
end
def generate_sitemap ( ) do
config = [
store: Sitemapper.S3Store ,
store_config: [ bucket: "example-bucket" ] ,
sitemap_url: "http://example-bucket.s3-aws-region.amazonaws.com"
]
Stream . concat ( [ 1 .. 100_001 ] )
|> Stream . map ( fn i ->
% Sitemapper.URL {
loc: "http://example.com/page- #{ i } " ,
changefreq: :daily ,
lastmod: Date . utc_today ( )
}
end )
|> Sitemapper . generate ( config )
|> Sitemapper . persist ( config )
|> Stream . run ( )
end
Sitemapper.generate
ได้รับ Stream
ของ URL ทำให้การสตรีมเนื้อหาของ Ecto Repo ลงในแผนผังไซต์เป็นเรื่องง่าย
def generate_sitemap ( ) do
config = [
store: Sitemapper.S3Store ,
store_config: [ bucket: "example-bucket" ] ,
sitemap_url: "http://example-bucket.s3-aws-region.amazonaws.com"
]
Repo . transaction ( fn ->
User
|> Repo . stream ( )
|> Stream . map ( fn % User { username: username , updated_at: updated_at } ->
% Sitemapper.URL {
loc: "http://example.com/users/ #{ username } " ,
changefreq: :hourly ,
lastmod: updated_at
}
end )
|> Sitemapper . generate ( config )
|> Sitemapper . persist ( config )
|> Stream . run ( )
end )
end
หากต้องการคงแผนผังไซต์ของคุณไว้ที่ระบบไฟล์ในเครื่อง แทนที่จะเป็น Amazon S3 การกำหนดค่าของคุณควรมีลักษณะดังนี้:
[
store: Sitemapper.FileStore ,
store_config: [
path: sitemap_folder_path
] ,
sitemap_url: "http://yourdomain.com"
]
โปรดทราบว่าคุณจะต้องดำเนินการให้เสร็จสิ้นใน Stream.run/1
หรือ Enum.to_list/1
เพื่อดำเนินการสตรีมและส่งคืนผลลัพธ์
sitemapper
เร็วกว่า fast_sitemap
ประมาณ 50% ในสถานการณ์ขนาดใหญ่ด้านล่าง (1,000,000 URL) sitemapper
จะใช้หน่วยความจำสูงสุด ~50MB ในขณะที่ fast_sitemap
ใช้ ~1,000MB
$ MIX_ENV=bench mix run bench/bench.exs
Operating System: macOS
CPU Information: Intel(R) Core(TM) i7-4870HQ CPU @ 2.50GHz
Number of Available Cores: 8
Available memory: 16 GB
Elixir 1.9.1
Erlang 22.0.4
Benchmark suite executing with the following configuration:
warmup: 2 s
time: 10 s
memory time: 0 ns
parallel: 1
inputs: large, medium, small
Estimated total run time: 1.20 min
Benchmarking fast_sitemap - simple with input large...
Benchmarking fast_sitemap - simple with input medium...
Benchmarking fast_sitemap - simple with input small...
Benchmarking sitemapper - simple with input large...
Benchmarking sitemapper - simple with input medium...
Benchmarking sitemapper - simple with input small...
# #### With input large #####
Name ips average deviation median 99th %
sitemapper - simple 0.0353 28.32 s ±0.00% 28.32 s 28.32 s
fast_sitemap - simple 0.0223 44.76 s ±0.00% 44.76 s 44.76 s
Comparison:
sitemapper - simple 0.0353
fast_sitemap - simple 0.0223 - 1.58x slower +16.45 s
# #### With input medium #####
Name ips average deviation median 99th %
sitemapper - simple 0.35 2.85 s ±0.57% 2.85 s 2.87 s
fast_sitemap - simple 0.23 4.28 s ±0.46% 4.28 s 4.30 s
Comparison:
sitemapper - simple 0.35
fast_sitemap - simple 0.23 - 1.50x slower +1.43 s
# #### With input small #####
Name ips average deviation median 99th %
sitemapper - simple 32.00 31.25 ms ±8.01% 31.20 ms 37.22 ms
fast_sitemap - simple 21.55 46.41 ms ±6.96% 46.26 ms 56.36 ms
Comparison:
sitemapper - simple 32.00
fast_sitemap - simple 21.55 - 1.49x slower +15.16 ms