这是我今天在http://filmaster.com"> filmaster.com上遇到的错误:
PicklingError:不能pickle:它与decimal.Decimal不是同一个对象
这究竟意味着什么?它似乎没有多大意义......它似乎与django缓存有关.你可以在这里看到整个追溯:
Traceback(最近一次调用最后一次):
文件"/home/filmaster/django-trunk/django/core/handlers/base.py",第92行,在get_response response = callback(request,*callback_args,**callback_kwargs)
在show_film
workflow.set_data_for_authenticated_user()中输入文件"/home/filmaster/film20/film20/core/film_views.py",第193行文件"/home/filmaster/film20/film20/core/film_views.py",第518行,在set_data_for_authenticated_user
object_id = self.the_film.parent.id)在get_others_ratings
set_cache 中输入文件"/home/filmaster/film20/film20/core/film_helper.py",第179行(CACHE_OTHERS_RATINGS,str(object_id)+"_"+ str(user_id),userratings)文件"/home/filmaster/film20/film20/utils/cache_helper.py",第80行,在set_cache中返回cache.set(CACHE_MIDDLEWARE_KEY_PREFIX + full_path,result,get_time(cache_string))
文件"/home/filmaster/django-trunk/django/core/cache/backends/memcached.py",第37行,设置为
self._cache.set(smart_str(key),value,timeout或self.default_timeout)文件"/usr/lib/python2.5/site-packages/cmemcache.py",第128行,在set val中,flags = self._convert(val)
文件"/usr/lib/python2.5/site-packages/cmemcache.py",第112行,在_convert val = pickle.dumps(val,2)
PicklingError:不能pickle:它与decimal.Decimal不是同一个对象
Filmaster的源代码可以从这里下载:bitbucket.org/filmaster/filmaster-test
任何帮助将不胜感激.
我使用django的默认站点地图应用程序实现了一个简单的站点地图类.由于执行时间很长,我添加了手动缓存:
class ShortReviewsSitemap(Sitemap):
changefreq = "hourly"
priority = 0.7
def items(self):
# try to retrieve from cache
result = get_cache(CACHE_SITEMAP_SHORT_REVIEWS, "sitemap_short_reviews")
if result!=None:
return result
result = ShortReview.objects.all().order_by("-created_at")
# store in cache
set_cache(CACHE_SITEMAP_SHORT_REVIEWS, "sitemap_short_reviews", result)
return result
def lastmod(self, obj):
return obj.updated_at
Run Code Online (Sandbox Code Playgroud)
问题是memcache只允许最大1MB的对象.这个比1MB大,所以存入缓存失败:
>7 SERVER_ERROR object too large for cache
Run Code Online (Sandbox Code Playgroud)
问题是django有一种自动的方法来决定何时应该将站点地图文件划分为较小的站点地图文件.根据文档(http://docs.djangoproject.com/en/dev/ref/contrib/sitemaps/):
如果您的某个站点地图的网址超过50,000,则应创建索引文件.在这种情况下,Django将自动对站点地图进行分页,索引将反映出来.
您认为启用缓存站点地图的最佳方式是什么? - 攻击django sitemaps框架以限制单个站点地图大小,比方说,10,000个记录似乎是最好的主意.为什么首先选择了50,000个?谷歌的建议?随机数? - 或许有一种方法可以让memcached存储更大的文件? - 或者也许保存了onces,站点地图应该作为静态文件提供?这意味着不是使用memcached进行缓存,而是必须手动将结果存储在文件系统中,并在下次请求站点地图时从那里检索它们(可能每天在cron作业中清理目录).
所有这些似乎都很低级,我想知道是否存在明显的解决方案......
我使用旧的Django 1.1版与hack,支持加入extra().它有效,但现在是改变的时候了.Django 1.2使用RawQuerySet,所以我重写了我的代码以解决该问题.问题是,RawQuery不支持我在代码中有很多的过滤器等.在CaktusGroup上挖掘Google,我发现,我可以使用query.join().这会很棒,但在代码中我有:
LEFT OUTER JOIN "core_rating" ON
("core_film"."parent_id" = "core_rating"."parent_id"
AND "core_rating"."user_id" = %i
Run Code Online (Sandbox Code Playgroud)
在query.join()中我写了第一部分,"core_film"."parent_id" = "core_rating"."parent_id"但我不知道如何在AND之后添加第二部分.
是否存在Django的任何解决方案,我可以使用自定义JOIN而无需重写所有过滤器代码(Raw)?
这是我们当前的extra()代码片段
top_films = top_films.extra(
select=dict(guess_rating='core_rating.guess_rating_alg1'),
join=['LEFT OUTER JOIN "core_rating" ON ("core_film"."parent_id" = "core_rating"."parent_id" and "core_rating"."user_id" = %i)' % user_id] + extra_join,
where=['core_film.parent_id in (select parent_id from core_film EXCEPT select film_id from filmbasket_basketitem where "wishlist" IS NOT NULL and user_id=%i)' % user_id,
'( ("core_rating"."type"=1 AND "core_rating"."rating" IS NULL) OR "core_rating"."user_id" IS NULL)',
' "core_rating"."last_displayed" IS NULL'],
)
Run Code Online (Sandbox Code Playgroud) 我正在尝试在代码字段上创建一个唯一索引:
$ CREATE UNIQUE INDEX "one_code_per_person" on "core_person"("code") WHERE "code" IS NOT NULL;
ERROR: could not create unique index "one_code_per_person"
DETAIL: Table contains duplicated values.
Run Code Online (Sandbox Code Playgroud)
它说有重复的值但是:
$ select code, count(*) from core_person group by code having count(*)>2;
code | count
-----------+-------
(0 rows)
Run Code Online (Sandbox Code Playgroud)
WTF?
我有一个简单的查询(postgresql,如果这很重要),它检索some_user的所有项目,不包括她在心愿单上的项目:
select i.*
from core_item i
left outer join core_item_in_basket b on (i.id=b.item_id and b.user_id=__some_user__)
where b.on_wishlist is null;
Run Code Online (Sandbox Code Playgroud)
以上查询运行在~50000ms(是的,数字是正确的).如果我删除"b.on_wishlist为null"条件或使其"b.on_wishlist is not null",则查询将在大约50ms内运行(相当大的变化).
该查询具有更多的连接和条件,但这是无关紧要的,因为只有这一个减慢了它.
有关数据库大小的一些信息:
我在这两个表上没有任何索引(除了id和外键).
问题是:我该怎么做才能让这个更快?我自己今晚有一些想法可以查看,但如果可能的话,我希望你们能帮忙.
谢谢!