我想拥有用户编辑的大文本字段的完整历史记录,使用Django存储.
我见过这些项目:
我有一个特殊的用例,可能超出了这些项目提供的范围.此外,我对这些项目的文档记录,测试和更新情况保持警惕.无论如何,这是我面临的问题:
我有一个模特,喜欢:
from django.db import models
class Document(models.Model):
text_field = models.TextField()
Run Code Online (Sandbox Code Playgroud)
这个文本字段可能很大 - 超过40k - 我希望有一个自动保存功能,每30秒左右保存一次字段.这可能会使数据库变得非常大,显然,如果每次40k都有很多保存(如果压缩可能仍然是10k).我能想到的最佳解决方案是保持最新保存版本和新版本之间的差异.
但是,我担心涉及并行更新的竞争条件.有两种截然不同的竞争条件(第二种情况比第一种情况严重得多):
HTTP事务竞争条件:用户A和用户B请求文档X0,并单独进行更改,生成Xa和Xb.Xa被保存,X0和Xa之间的差异是"Xa-0"("少了一点"),Xa现在被存储为数据库中的正式版本.如果Xb随后保存,则覆盖Xa,差异为Xb-a("b减去a").
虽然不理想,但我并不过分担心这种行为.文档相互重写,用户A和B可能彼此不知道(每个文档都以文档X0开头),但历史保留了完整性.
数据库读取/更新竞争条件:有问题的竞争条件是Xa和Xb同时保存在X0上.会有(伪)代码类似于:
def save_history(orig_doc, new_doc):
text_field_diff = diff(orig_doc.text_field, new_doc.text_field)
save_diff(text_field_diff)
Run Code Online (Sandbox Code Playgroud)
如果Xa和Xb都从数据库中读取X0(即orig_doc是X0),它们的差异将变为Xa-0和Xb-0(与序列化的Xa-0相反,然后是Xb-a,或等效的Xb-0然后Xa b).当您尝试将差异拼接在一起以生成历史记录时,它将在修补程序Xa-0或Xb-0(均适用于X0)上失败.历史的完整性已经受到损害(或者有吗?).
一种可能的解决方案是自动协调算法,该算法可以事后检测这些问题.如果重建历史记录失败,可能会假设已发生竞争条件,因此将失败的修补程序应用于历史记录的先前版本,直到成功为止.
我很高兴能就如何解决这个问题得到一些反馈和建议.
顺便说一句,只要它是一个有用的出路,我注意到这里讨论了Django原子性:
非常感谢你.
我有一个下载网页的python脚本,解析它并从页面返回一些值.我需要抓一些这样的页面来获得最终结果.每个页面检索需要很长时间(5-10s),我宁愿并行提出请求以减少等待时间.
问题是 - 哪种机制可以快速,正确地执行,并且CPU /内存浪费最少?扭曲,异步,线程,其他什么?你能提供一些例子的链接吗?
谢谢
UPD:这个问题有一些解决方案,我正在寻找速度和资源之间的妥协.如果你能告诉一些经验细节 - 从你的观点来看它是如何快速负载 - 这将是非常有帮助的.
与STATS.se交叉,因为这个问题可以跨越两个STAT.se/SO https://stats.stackexchange.com/questions/17712/parallelize-solve-for-ax-b
我有一些非常大的稀疏矩阵,使用矩阵包中的spMatrix函数创建.
使用solve()函数适用于我的Ax = b问题,但需要很长时间.几天.
我注意到http://cran.r-project.org/web/packages/RScaLAPACK/RScaLAPACK.pdf 似乎有一个可以并行化解决方案功能的功能,但是,可能需要几周的时间来安装新的软件包特定服务器.
服务器已经安装了雪包.
所以
谢谢.
[编辑] - 其他细节
矩阵约为370,000 x 370,000.我用它来解决alpha中心问题,http://en.wikipedia.org/wiki/Alpha_centrality.我最初在igraph包中使用alpha中心函数,但它会崩溃R.
更多细节
我正在从模板克隆ESX服务器上的VM.简化代码如下所示:
Workflow Create-VM {
$List = 1..500
foreach -parallel ($Elem in $List)
{
# Create VM ...
# Configure created VM ..
}
}
Create-VM
Run Code Online (Sandbox Code Playgroud)
并行执行非常有用.不幸的是,在这种情况下不能很好地工作.生成了太多并行请求.我需要将并行执行次数限制为较小的数字(例如4).
我试图更改本地会话配置(SessionThrottleLimit,MaxSessionsPerWorkflow,MaxRunningWorkflows)http://technet.microsoft.com/en-us/library/hh849862.aspx.
$WWE = New-PSWorkflowExecutionOption -SessionThrottleLimit 4
Set-PSSessionConfiguration -Name microsoft.powershell.workflow `
-SessionTypeOption $WWE
Get-PSSessionConfiguration microsoft.powershell.workflow |
fl SessionThrottleLimit
Run Code Online (Sandbox Code Playgroud)
题
我已经阅读了Mark Harris的文章"优化并行缩减CUDA",我发现它非常有用,但我仍然无法理解1或2个概念.它写在第18页:
//First add during load
// each thread loads one element from global to shared mem
unsigned int tid = threadIdx.x;
unsigned int i = blockIdx.x*blockDim.x + threadIdx.x;
sdata[tid] = g_idata[i];
__syncthreads();
Run Code Online (Sandbox Code Playgroud)
优化代码:有2个负载和第一个减少的添加:
// perform first level of reduction,
// reading from global memory, writing to shared memory
unsigned int tid = threadIdx.x; ...1
unsigned int i = blockIdx.x*(blockDim.x*2) + threadIdx.x; ...2
sdata[tid] = g_idata[i] + g_idata[i+blockDim.x]; ...3
__syncthreads(); ...4
Run Code Online (Sandbox Code Playgroud)
我无法理解第2行; 如果我有256个元素,如果我选择128作为我的块大小,那么为什么我将它乘以2?请解释如何确定块大小?
给出以下代码:
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
for i := 0; i < 3; i++ {
go f(i)
}
// prevent main from exiting immediately
var input string
fmt.Scanln(&input)
}
func f(n int) {
for i := 0; i < 10; i++ {
dowork(n, i)
amt := time.Duration(rand.Intn(250))
time.Sleep(time.Millisecond * amt)
}
}
func dowork(goroutine, loopindex int) {
// simulate work
time.Sleep(time.Second * time.Duration(5))
fmt.Printf("gr[%d]: i=%d\n", goroutine, loopindex)
}
Run Code Online (Sandbox Code Playgroud)
我可以假设'dowork'函数将并行执行吗?
这是实现并行性的正确方法还是更好地使用渠道并为每个goroutine分离"dowork"工作者?
以下是面试问题:
以下单行生成并显示前500个素数的列表.如何使用并行LINQ优化它,同时仍保持单个C#语句:
MessageBox.Show(string.Join(",",
Enumerable.Range(2, (int)(500 * (Math.Log(500) + Math.Log(System.Math.Log(500)) - 0.5)))
.Where(x => Enumerable.Range(2, x - 2)
.All(y => x % y != 0))
.TakeWhile((n, index) => index < 500)));
Run Code Online (Sandbox Code Playgroud)
我尝试引入AsParallel()以及ParallelEnumerable查询,但没有看到多核机器的任何实际好处.查询仍然使用一个CPU核心,而其他核心享受休闲时间.有人可以提出一项改进措施,将负载平均分配到所有内核上,从而缩短执行时间吗?
对于发烧友:以下公式返回一个上限,保证大于N个素数,即如果你检查这个数字,你肯定会发现小于它的N个素数:
UpperBound = N * (Log(N) + Log(Log(N)) - 0.5) //Log is natural log
Run Code Online (Sandbox Code Playgroud) 该程序使用C Lagrange和MPI编写.我是MPI的新手,想要使用所有处理器进行一些计算,包括进程0.为了学习这个概念,我编写了以下简单程序.但是这个程序在接收到进程0的输入后挂在底部,并且不会将结果发送回进程0.
#include <mpi.h>
#include <stdio.h>
int main(int argc, char** argv) {
MPI_Init(&argc, &argv);
int world_rank;
MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
int world_size;
MPI_Comm_size(MPI_COMM_WORLD, &world_size);
int number;
int result;
if (world_rank == 0)
{
number = -2;
int i;
for(i = 0; i < 4; i++)
{
MPI_Send(&number, 1, MPI_INT, i, 0, MPI_COMM_WORLD);
}
for(i = 0; i < 4; i++)
{ /*Error: can't get result send by other processos bellow*/
MPI_Recv(&number, 1, MPI_INT, i, 99, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
printf("Process 0 received number %d …Run Code Online (Sandbox Code Playgroud) 我的makefile中的一个目标是一个非常耗时且耗时的任务.但我可以分开工作负载并多次并行运行任务,以加快整个过程.
我的问题是make不等待所有进程完成.
考虑这个简单的脚本,名为myTask.sh:
#!/bin/bash
echo "Sleeping $1 seconds"
sleep $1
echo "$1 are over!"
Run Code Online (Sandbox Code Playgroud)
现在,让我们从bash脚本中调用它,并wait用来等待所有任务完成:
#!/bin/bash
echo "START"
./myTask.sh 5 &
./myTask.sh 15 &
./myTask.sh 10 &
wait # Wait for all tasks to complete
echo "DONE"
Run Code Online (Sandbox Code Playgroud)
输出如预期:
START
Sleeping 15 seconds
Sleeping 5 seconds
Sleeping 10 seconds
5 are over!
10 are over!
15 are over!
DONE
Run Code Online (Sandbox Code Playgroud)
但是在尝试相同的时候Makefile:
test:
echo "START"
./myTask.sh 5 &
./myTask.sh 15 &
./myTask.sh 10 &
wait
echo "DONE" …Run Code Online (Sandbox Code Playgroud) 我有一个最近的12核Intel CPU(Haswell架构),它有4个内存通道.机器可以并行执行多少次DRAM内存访问?
例如,如果我有一个使用12个线程的程序,这些线程位于紧密循环中,从一个范围太大而无法容纳缓存的随机存储器地址读取单个字节.我希望所有12个线程将花费几乎所有时间等待内存提取.
线程是否必须轮流使用DRAM总线?
注意:假设我使用的是1 GB的VM页面大小,因此没有TLB缓存未命中.