你会如何在Ruby中处理一个非常大的向量?

时间:2008-09-27 18:07:50

标签: mysql ruby

我打算用Ruby编写一个程序来分析一些从在线调查问卷中回来的数据。有数十万条回复,每位受访者回答大约200个问题。每个问题都是多项选择,因此对每个问题都有固定数量的可能响应。

目的是使用每个受访者提供的一张人口统计数据来训练一个系统,该系统可以从回答同一问卷的受访者那里猜出同一段人口统计数据(例如年龄),但不是指定人口统计数据。

因此,我计划使用向量(在数学意义上,而不是在数据结构意义上)来表示给定受访者的答案。这意味着每个向量将很大(超过200个元素),并且总数据集将是巨大的。我计划将数据存储在MySQL数据库中。

因此。 2个问题:

  1. 我应该如何将其存储在数据库中?每回复一行一行,或每个受访者一行?或其他什么?

  2. 我打算使用像k-最近邻算法这样的东西,或像天真的贝叶斯分类器这样的简单机器学习算法来学习对新响应进行分类。我应该纯粹通过SQL操作数据还是应该将其加载到内存中并将其存储在某种大型阵列中?

5 个答案:

答案 0 :(得分:3)

首先想到的是:将其存储在内存中对于处理目的而言绝对合理。假设您为每个答案保留一个字节,您有一百万个响应和200个问题,那么您有一个200 MB的数组。即使使用32位操作系统,在现代桌面上也不小但绝对不会耗费内存。

至于数据库,我认为你应该有三个表。一个用于具有人口统计数据的受访者,一个用于问题,并且,由于这些表之间具有n:m关系,第三个具有Respondent-ID,Question-ID和Answercode。

如果您不需要问题的其他数据(例如问题文本或其他内容),您甚至可以优化问题表。

答案 1 :(得分:3)

在内存中使用数组数组。我刚刚创建了一个500000x200阵列,它需要大约500MB的RAM。在2GB机器上轻松管理,比使用SQL快许多个数量级。

就个人而言,我根本不会把数据放在MySQL中。只需将其编入进出,和/或使用JSON或CSV。

答案 2 :(得分:2)

如果你肯定需要数据库存储,而其他地方关于替代品的评论值得考虑,那么我建议不要在200多行中存储200多个响应:你似乎没有任何明显的灵活性需求这样的设计将给成千上万的受访者提供和表现将是可怕的。

使用RDBMS,您可以存储大量数据,以各种多维方式访问它们,并随着时间的推移逐步扩展数据结构。但是你在平面文件(或Marshalled或其他)选项中获得的灵活性通常会在性能上下降。我不得不承认自己过早地达到第三范式。我想问题是,您希望查询需要多大的灵活性,以及​​您认为您的数据可能会发生多大变化?如果您认为自己处于两者的低端,请考虑将SQL保留在架子上。如果将数据访问抽象为单独的层,那么以后更改应该很便宜。只是一个想法...

我希望你可以编码个人的响应,以便它可以很容易地在代码中使用,并且它不可能超过200个字符,如果你使用某种打包或位映射,则更少。我更喜欢比特映射的想法,想到它 - 它使用像汉明距离这样的东西进行简单的比较是一件轻而易举的事。

答案 3 :(得分:0)

我不是一个很棒的数据库人,所以我只回答#2:

如果您真的想节省内存(或预见会有更多数据的情况),您可以充分利用这两个方面:使用ruby本质上是一种数据挖掘工具。让它从数据库中提取一些数据,然后将结果写回数据库(可能在一个不同的表或数据库下)。这样做的好处是只使用你想要的内存。

答案 4 :(得分:0)

不要忘记Ruby是一种动态对象语言,因此,一个简单的整数可能比C中的一个简单的int占用更多的空间。它需要额外的空间才能表征它是否已被“装饰”以及任何其他信息,方法等。