gpt4 book ai didi

ruby-on-rails - Rails 设计疑问 : Should/could I load the whole dictionary/table into memory?

转载 作者:行者123 更新时间:2023-12-04 06:34:43 24 4
gpt4 key购买 nike

我是一个使用简单 Rails 应用程序的新手,该应用程序将文档(长字符串)从一种语言翻译成另一种语言。字典是一个术语表(一个用于查找和替换的字符串正则表达式,以及一个输出替换字符串的块)。该表有 100 万条记录。

每个请求都是一个要翻译的文档。在第一个粗暴的方法中,我需要针对每个请求/文档运行整个字典。

由于字典每次都会完整运行(从第一条记录到最后一条记录),而不是将字典的记录表与每个文档一起加载,我认为最好将整个字典作为内存中的数组。

我知道它不是最有效的,但此时字典必须完整运行。

1.- 如果通过重组文档和字典无法提高效率(意味着不可能创建更小的字典子集)。最好的设计方法是什么?

2.- 你知道我可以学习的类似项目吗?

3.- 我应该在哪里学习如何在 Rails 启动时将这么大的表加载到内存(缓存?)?

任何提出的问题的任何答案将不胜感激。非常感谢!

最佳答案

我认为您的网络托管商不会对这样的解决方案感到满意。这个脚本

dict = {}
(0..1000_000).each do | num |
dict[/#{num}/] = "#{num}_subst"
end

在我的 MBP 上消耗 1 GB 的 RAM 来存储哈希表。另一种方法是将您的替换存储在 memcached 中,以便您(至少)可以跨机器存储它们。
require 'rubygems'
require 'memcached'
@table = Memcached.new("localhost:11211")

retained_keys = (0..1000_000).each do | num |
stored_blob = Marshal.dump([/#{num}/, "#{num}_subst"])
@table.set("p#{num}", stored_blob)
end

您将不得不担心保持 key “热”,因为如果不需要它们,memcached 会使它们过期。

然而,对于您的情况,最好的方法是非常简单 - 将您的替换写入一个文件(每个替换一行)并制作一个流过滤器,逐行读取文件,并从该文件中替换。您还可以通过映射工作来并行化它,例如,每个替换字母和替换标记。

但这应该让你开始:
  require "base64"

File.open("./dict.marshal", "wb") do | file |
(0..1000_000).each do | num |
stored_blob = Base64.encode64(Marshal.dump([/#{num}/, "#{num}_subst"]))
file.puts(stored_blob)
end
end

puts "Table populated (should be a 35 meg file), now let's run substitutions"

File.open("./dict.marshal", "r") do | f |
until f.eof?
pattern, replacement = Marshal.load(Base64.decode64(f.gets))
end
end

puts "All replacements out"

要填充文件并加载每个替换,这需要我:
 real    0m21.262s
user 0m19.100s
sys 0m0.502s

只需从文件中加载正则表达式和字符串(所有百万,逐个)
 real    0m7.855s
user 0m7.645s
sys 0m0.105s

所以这是 7 秒的 IO 开销,但您不会丢失任何内存(并且有很大的改进空间)- RSIZE 约为 3 兆。如果您批量执行 IO,或者为 10-50 个替换制作一个文件并将它们作为一个整体加载,您应该可以轻松地使其运行速度更快。将文件放在 SSD 或 RAID 上,您就赢了,但您可以保留 RAM。

关于ruby-on-rails - Rails 设计疑问 : Should/could I load the whole dictionary/table into memory?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2128273/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com