我们将如何在Ruby中处理非常大的向量?
我打算用Ruby编写一个程序,以分析一些从在线调查表中获得的数据。响应数以十万计,每个响应者回答约200个问题。每个问题都是多项选择,因此每个问题都有固定数量的可能答案。
目的是使用每个受访者提供的一段人口统计数据来训练一个系统,该系统随后可以从回答相同调查表但未指定受众的受访者中猜测同一段人口统计数据(例如年龄)数据。
因此,我计划使用向量(从数学意义上而不是从数据结构意义上)表示给定受访者的答案。这意味着每个向量都将很大(超过200个元素),并且总数据集将非常巨大。我计划将数据存储在MySQL数据库中。
所以。 2个问题:
- 我应该如何将其存储在数据库中?对一个问题的每个回答是一行,还是对每个受访者是一行?或者是其他东西?
- 我打算使用类似k近邻算法或者简单的机器学习算法(如朴素的贝叶斯分类器)来学习对新的响应进行分类。我应该纯粹通过SQL操作数据还是应该将其加载到内存中并将其存储在某种庞大的数组中?
解决方案
首先想到的是:出于处理目的,将其存储在内存中绝对是合理的。假设我们为每个答案保留一个字节,我们有一百万个答案和200个问题,那么我们有一个200 MB的数组。即使是32位操作系统,它也不小,但绝对不会在现代台式机上耗尽内存。
至于数据库,我认为我们应该有三个表。一个用于回答具有人口统计数据的受访者,一个用于回答问题,并且由于我们在这些表之间具有n:m关系,因此第三种是具有受访者ID,问题ID和Answercode的关系。
如果我们不需要问题的其他数据(例如问题文本或者其他内容),甚至可以优化问题表。
在内存中使用数组数组。我刚刚创建了一个500000x200的阵列,它需要大约500MB的RAM。在2GB的计算机上易于管理,并且比使用SQL快许多个数量级。
就个人而言,我根本不会理会将数据放入MySQL。只需将其编组进出,和/或者使用JSON或者CSV。
我不是一个出色的数据库专家,所以我只回答#2:
如果我们真的想节省内存(或者预见会有更多数据的情况),则可以兼顾两者:使用ruby本质上是一种数据挖掘工具。让它从数据库中提取一些数据,然后将结果写回到数据库中(可能在完全不同的表或者数据库下)。这样的好处是仅使用所需的内存。
如果我们确实需要数据库存储,并且其他地方的注释值得考虑,那么我建议我们不要将200多个响应存储在200多个行中:我们似乎并不需要明显的灵活性,例如设计将给与回报,成千上万的受访者的表现将非常糟糕。
使用RDBMS可以存储大量数据,以多种多维方式访问它们并随时间扩展临时数据的结构。但是,相对于平面文件(或者编组文件或者其他)选项而言,灵活性所带来的灵活性通常会降低。我不得不承认自己太早达到第三种正常形式。我想的问题是,我们期望在查询中需要多少灵活性,以及我们认为数据可能会发生多少变化?如果我们认为自己处于两者的低端,请考虑将SQL搁置。如果将数据访问抽象到一个单独的层,那么以后更改应该很便宜。只是一个想法...
我希望我们可以对个人的回复进行编码,以便可以轻松地在代码中使用它,并且不大可能需要超过200个字符,如果使用某种打包或者位图映射,则更少。我宁愿喜欢位图的想法,想到它,使用汉明距离之类的东西就可以轻松进行比较,这绝对是一件轻而易举的事。
别忘了Ruby是一种动态对象语言,因此,简单的整数可能比C语言中的简单int占用更多的空间。如果它被"修饰"为其他字符,则它需要额外的空间来表征。信息,方法等