问题
为大型文本字段加载夹具会使夹具处理过程崩溃,甚至经常损坏夹具 (.yml) 文件。
环境
红宝石 1.9.3p194(2012-04-20 修订版 35410)[x86_64-darwin10.8.0];导轨 3.2.6;OSX 10.6.8;Web砖块;和 MySQL — 8 Gb RAM
背景
1:我们的项目展示了大量的文章,经常超过5-10,000字。
2:分配给记录的转义内容(即使是中等数量的)会使夹具进程崩溃。
3:rake db:fixtures:load 将在主题 .yml 文件上崩溃,并出现以下错误/警告:无法确定响应正文的内容长度。设置响应的内容长度或设置 Response#chunked = true。
4:即使我们将这些材料分解为 1,000 字或更少的中等大小的文本字段,db:fixtures:load 仍然会在主题 .yml 文件上崩溃。
5: 文件经常被崩溃损坏。例如,我可以使用空字段分配从头开始重建夹具;我可以一次添加和处理 (db:fixtures:load) 一个字段,直到达到明显的处理量限制,当这最终使夹具加载过程崩溃时,有时会在文件的最初几个字符中报告错误字符; 即使我删除了最后一个字段分配,该文件也将不再运行。
6:实验已经确定,夹具可以分配给单个记录的 yml 有大约 50k 的限制。我有许多 yml 文件成功分配给多个记录,但没有一个成功分配超过 50k * 给单个记录。这种体验在数十张桌子上是统一的。
6.1:例如,建议此类阈值的主体文件仅创建一条记录:
6.1.1: 如果我将空字段内容分配给所有文本字段,rake db:fixtures:load会成功创建一个没有其文本字段的记录。
6.1.2:但是,如果我增加插入单个记录的大小 (k) ,逐个字段,一旦我越过 50k 阈值(大约),进程就会崩溃并出现以下错误:
耙中止!Mysql2::Error: 从存储引擎得到错误 139: INSERT INTO
[table_name]
6.1.3: 但增加 MySQL 缓冲区大小并没有解决问题。我有完全相同的限制。
6.1.3.1:这是我在 my.cnf 中的 MySQL 缓冲区大小:
[mysqld]
key_buffer_size = 256M
max_allowed_packet = 1M
table_open_cache = 256
sort_buffer_size = 1M
read_buffer_size = 1M
read_rnd_buffer_size = 4M
myisam_sort_buffer_size = 64M
thread_cache_size = 8
query_cache_size= 16M
6.1.4: 我还在 webrick/httpresponse.rb 的所有实例中将 chunked 设置为 true,如下所示:
def initialize(config)
@config = config
@logger = config[:Logger]
@header = Hash.new
@status = HTTPStatus::RC_OK
@reason_phrase = nil
@http_version = HTTPVersion::convert(@config[:HTTPVersion])
@body = ''
@keep_alive = true
@cookies = []
@request_method = nil
@request_uri = nil
@request_http_version = @http_version # temporary
@chunked = true # @chunked = false
@filename = nil
@sent_size = 0
end
这些尝试都没有对这个问题产生任何影响。
7: 因此我推断阈值适用于分配给单个记录的k,因为我有许多超过1M的yml文件。
相关问题?
8: 我看到其他问题报告同样的“设置响应的内容长度”警告/错误。然而,我阅读的实例报告了在 WebBrick 中查看页面时发生的错误。在我们的情况下根本不是这种情况(尽管我们现在使用的是 WebBrick)。我们在使用 Mongrel 时遇到了同样的问题;但我没有看到任何证据表明我们的问题与本地 Ruby Web 服务器完全相关。
9: 204_304_keep_alive.patch:我还看到人们正在通过应用 204_304_keep_alive.patch 来修复这个由 Web 服务器进程引起的错误。但是,特别是当我们没有在网络服务器进程中遇到错误情况时,这个补丁可能与我们的问题相关,也可能不相关。
10:我在几个 OSX 系统和早期的 Ruby 1.8/Rails 2 上遇到了同样的问题。
问题
其他人必须将 50k 分配给带有固定装置的单个记录。
有谁知道我们必须在 Ruby/Rails/OSX/MySQL 环境中配置或更改什么来克服这个非常麻烦的负担?