背景
我正在为计算语言学项目开发一个计算密集的项目,但我遇到的问题非常普遍,因此我希望解决方案对其他人来说也很有趣.
要求
我必须写的这个特定程序的关键方面是它必须:
步骤1和2并不难有效:只需使用生成器并拥有数据分析管道.最大的问题是操作3(和连接4)
括号:技术细节
如果构建向量的实际过程影响解决方案:
对于语料库中的每一行,一个或多个向量必须更新其基重.
如果你根据python列表来考虑它们,每一行在处理时,通过将一个或多个索引处的这些列表的值递增一个值来更新一个或多个列表(如果需要,可以创建它们)(可能会因此而异)指数).
向量不依赖于彼此,也不重要读取语料库的顺序.
试图解决方案
关于如何做到这一点,有三个极端:
所有这些选择都相当棘手.1只是耗尽了所有的系统内存,它会引起恐慌和减速.因为IO操作不快,所以2太慢了.出于同样的原因,3可能甚至比2慢.
目标
一个好的解决方案包括:
问题是,我不确定如何解决这个问题.担心像RAM这样的系统属性似乎有点单声道,但我没有看到如何在不考虑这一点的情况下最佳地解决这类问题.结果,我真的不知道如何开始这种事情.
题
有谁知道如何解决这类问题?我的python根本不是这种东西的正确语言?或者是否有一个简单的解决方案可以最大化从内存中完成多少(在合理范围内),同时最小化必须从磁盘读取数据或写入数据的次数?
非常感谢您的关注.我期待着看到stackoverflow的聪明才智能够引起我的注意.
额外细节
运行这个问题的机器通常有20多个内核和~70G的RAM.该问题可以并行化(例如,MapReduce),因为可以从语料库的片段构建一个实体的单独向量,然后将其添加以获得将从整个语料库构建的向量.
部分问题涉及确定在磁盘写入需要发生之前可以在内存中构建多少的限制.python是否提供任何机制来确定可用的RAM数量?
我对C很陌生,对于我的大多数研究来说,没有太多需要比python更快的东西.然而,事实证明我最近所做的工作需要计算相当大的向量/矩阵,因此可能有一个C + MPI解决方案.
从数学上讲,任务很简单.我有很多维数〜40k的向量,并希望计算这些向量的选定对的Kronecker积,然后对这些kronecker积进行求和.
问题是,如何有效地做到这一点?以下代码结构是否有任何问题,使用for循环或获得效果?
该函数kron
如下所述传递载体A
和B
长度vector_size
,并计算它们的Kronecker乘积,它存储在C
,一个vector_size*vector_size
矩阵.
void kron(int *A, int *B, int *C, int vector_size) {
int i,j;
for(i = 0; i < vector_size; i++) {
for (j = 0; j < vector_size; j++) {
C[i*vector_size+j] = A[i] * B[j];
}
}
return;
}
Run Code Online (Sandbox Code Playgroud)
这对我来说似乎很好,当然(如果我没有做出一些愚蠢的语法错误)产生正确的结果,但我有一种潜在的怀疑,即嵌入式循环不是最佳的.如果我还有其他方法可以解决这个问题,请告诉我.建议欢迎.
我感谢你的耐心和任何建议.再一次,我对C非常缺乏经验,但谷歌搜索给我带来了这个查询的一点乐趣.
背景
我正在处理的问题如下:
在我为我的研究设计的实验环境中,我生成了大量的(长度为4M)阵列,这些阵列有点稀疏,因此可以存储为scipy.sparse.lil_matrix
实例,或者仅仅作为scipy.array
实例存储(空间增益/损失不是'这个问题).
这些数组中的每一个都必须与字符串(即一个单词)配对才能使数据有意义,因为它们是表示该字符串含义的语义向量.我需要保持这种配对.
列表中每个单词的向量是逐个构建的,并在移动到下一个单词之前存储到磁盘.
它们必须以某种方式存储到磁盘,然后可以使用类似字典的语法检索它们.例如,如果所有单词都存储在类似DB的文件中,我需要能够打开这个文件并执行类似的操作vector = wordDB[word]
.
当前的方法
我目前在做什么:
使用shelve
打开一个名为货架wordDB
(当前正在使用的向量中的每个时间lil_matrix
从scipy.sparse
)一个单词建立,存储在所述搁板的矢量:wordDB[word] = vector
当我需要在评估过程中使用向量时,我会做相反的事情:打开架子,然后vector = wordDB[word]
根据需要对每个单词进行调用,这样就不需要将所有向量都保存在RAM中(是不可能).
上述"解决方案"符合我在解决指定问题方面的需求.问题很简单,当我希望使用这种方法来构建和存储大量单词的向量时,我只是耗尽了磁盘空间.
据我所知,这是因为shelve
存储了正在存储的数据,这不是存储大型数组的有效方法,因此使得存储问题难以解决shelve
我需要处理的单词数量.
问题
问题是:有没有一种方法可以序列化我的数组,它将:
将数组本身保存为压缩二进制格式,类似于.npy
生成的文件scipy.save
?
满足我的要求,数据可以作为字典从磁盘读取,维护单词和数组之间的关联?
我刚刚升级到OS X Lion,我正在尝试安装Qt SDK.我已经通过自制软件安装了Qt 4.7.3 ,并且我试图让Qt SDK 1.1.1运行我的机器.
我从诺基亚Qt站点下载了安装程序,然后运行它.但是,在安装过程中出现了一系列奇怪的错误:
我点击"重试"几次无效,所以点击"忽略",因为"取消"退出安装程序.
再次点击"重试".
最后,再次单击"重试",安装完成.
然而,显然有一些错误,因为当我尝试运行Qt Creator时,我会看到以下窗口:
可以看到,右侧的Qt Designer选项卡以及Projects选项卡显示为灰色.我尝试再次运行安装程序,并弹出相同的确切错误.我尝试使用谷歌搜索解决方案(寻找涉及harmattan-postinstall.sh的错误)并没有出现任何问题.
还有其他人遇到过这些问题吗?有谁知道解决方案?
问题
我正在编写一个从语料库中读取一组文档的程序(每一行都是一个文档)。每个文档都使用一个函数进行处理processdocument
,分配一个唯一的 ID,然后写入数据库。理想情况下,我们希望使用多个进程来完成此操作。逻辑如下:
processdocument
,并将信息写入数据库表中的新条目。题
我对 sqlalchemy(以及一般的数据库)比较陌生。据我所知,我认为用于在主例程中设置数据库的代码工作正常。我遇到的问题是,我不确定在不与其他进程发生冲突的情况下,为每个进程写入数据库的工作函数到底应该放什么。
没有什么特别复杂的事情:每个进程都从一个受锁保护的 multiprocessing.Value 对象中获得一个唯一的值来分配给一个条目。我只是不确定是否应该将什么传递给工作函数(队列除外),如果有的话。我是否传递了我在主程序中创建的 sqlalchemy.Engine 实例?元数据实例?我是否为每个流程创建一个新引擎?有没有其他一些规范的方法来做到这一点?有什么特别需要我记住的吗?
补充评论
我很清楚我可以不打扰多处理,而是在一个进程中执行此操作,但是我将不得不编写具有多个进程读取数据库的代码,所以我不妨弄清楚该怎么做现在这个。
在此先感谢您的帮助!