0

问题

为大型文本字段加载夹具会使夹具处理过程崩溃,甚至经常损坏夹具 (.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 环境中配置或更改什么来克服这个非常麻烦的负担?

4

1 回答 1

0

MySQL 仅限于 10 个文本字段

征服这个有一条曲线:

我的实验解决问题的逻辑过程首先将一个大文本字段拆分为 14 个较小的文本字段。

因此,如果我在增加缓冲区大小之前没有将原始文本字段拆分为 14 个单独的文本字段,那么增加我们的 MySQL 缓冲区大小解决我们的固定/插入问题。我假设 14 个中等大小的文本字段不会对缓冲区大小增加的测试产生排他性影响,但今天下午我发现了一个 MySQL 错误报告,指出(对于遇到类似问题的实现)MySQL 最多支持 10 个文本字段. 碰巧当我添加了 14 个文本字段中的第 11 个时,我超过了 50k 阈值。

编写清晰的错误处理程序的更多理由......超过 10 个文本字段限制*也会产生与缓冲区空间不足相同的错误!

无论如何,我希望这种经历能够引导其他人绕过这两种情况。我有很多时间来修复我们的配置。

无论如何,经验法则是:

  1. 遵守 MySQL 的 10 个文本字段限制。
  2. 在 /etc/my.cnf 中部署足够的缓冲区大小。

有了备用 RAM,我正在运行“ my-large.cnf ”以满足我们项目的需要。

于 2012-10-01T05:27:14.310 回答