小编Ste*_*tto的帖子

使用cPickle序列化大型字典会导致MemoryError

我正在为一组文档上的搜索引擎编写倒排索引.现在,我将索引存储为字典词典.也就是说,每个关键字都映射到docIDs->发生位置的字典.

数据模型类似于:{word:{doc_name:[location_list]}}

在内存中构建索引工作正常,但是当我尝试序列化到磁盘时,我遇到了一个MemoryError.这是我的代码:

# Write the index out to disk
serializedIndex = open(sys.argv[3], 'wb')
cPickle.dump(index, serializedIndex, cPickle.HIGHEST_PROTOCOL)
Run Code Online (Sandbox Code Playgroud)

在序列化之前,我的程序使用大约50%的内存(1.6 Gb).一旦我打电话给cPickle,我的内存使用率在崩溃之前就会猛增至80%.

为什么cPickle使用如此多的内存进行序列化?有没有更好的方法来解决这个问题?

python serialization pickle inverted-index

8
推荐指数
1
解决办法
2127
查看次数

MongoDB原子性问题 - 修改内存中的文档

我正在使用MongoDB处理当前项目,并对构建对并发修改的支持的正确方法感到困惑.

我有一个对象数组.当请求进来时,我想检查该数组中的最后一个元素,并就如何响应做出条件决定.我的代码如下所示:

# Find the last object ID in the array.
last_element_id = str(document['objects'][-1])
if last_element_id != the_element_id_the_request_is_responding_to:
    db.documents.insert({
        ...
    })
else:
    # Append the response to the end of the array.
    document['objects'].append(new_element_id)
    db.documents.save(document)
Run Code Online (Sandbox Code Playgroud)

我关注的情况是:

  1. 在处理请求A时,我发现last_element_id是有效的,并且响应应该附加到列表的末尾.
  2. 在append()和save()操作完成之前,处理另一个请求B.
  3. B也看到last_element_id有效,追加()响应和save().
  4. 现在,A的响应被排列到数组的末尾,但是响应不再跟随假设的'last_element_id',因为B的响应事先就被偷走了.

在Mongo的原子模型中处理这种逻辑的正确方法是什么?如果可以避免使用锁,我不想使用锁,因为WSGI应用程序可以同时在多个进程中运行.

谢谢!

python atomicity mongodb

5
推荐指数
1
解决办法
261
查看次数

iOS:保存到相机胶卷时保留 JFIF/EXIF 数据

原问题

我正在尝试将图像保存到相机胶卷中,同时保留所有原始 EXIF/JFIF 数据。我希望保存到相机胶卷的图像与原始文件逐字节相同。当我通过 保存图像时[ALAssetsLibrary writeImageDataToSavedPhotosAlbum:metadata:completionBlock:],原始 EXIF 数据被保留,但 JFIF 被剥离。

ALAssetsLibrary *library = [[[ALAssetsLibrary alloc] init] autorelease];
[library writeImageDataToSavedPhotosAlbum:imageData metadata:nil completionBlock:^(NSURL *assetURL, NSError *error) {
    [self imageDidFinishSavingToCameraRollWithError:error];
}];
Run Code Online (Sandbox Code Playgroud)

我尝试使用iphone-exif项目解析出 JFIF 数据并通过元数据参数显式传递它:

EXFJpeg *jpegScanner = [[EXFJpeg alloc] init];
[jpegScanner scanImageData:imageData];
EXFJFIF *jfif = [jpegScanner jfif];

NSMutableDictionary *jfifMetadata = [[NSMutableDictionary alloc] init];
[jfifMetadata setObject:[jfif version] forKey:(NSString *)kCGImagePropertyJFIFVersion];
...
NSMutableDictionary *metadata = [[NSMutableDictionary alloc] init];
[metadata setObject:jfifMetadata forKey:(NSString*)kCGImagePropertyJFIFDictionary];
Run Code Online (Sandbox Code Playgroud)

但是这样做会产生相同的文件,逐字节传递nil元数据字典,这意味着 JFIF 数据仍在被 iOS 剥离。

根据维基百科

从形式上讲,Exif …

exif ios

5
推荐指数
0
解决办法
2113
查看次数

标签 统计

python ×2

atomicity ×1

exif ×1

inverted-index ×1

ios ×1

mongodb ×1

pickle ×1

serialization ×1