上下文: 我有一个处理和显示大量日志文件的Web应用程序.它们通常只有大约10万行,但它可以达到400万行或更多.为了能够滚动浏览该日志文件(用户启动和通过JavaScript)并过滤具有良好性能的行,我会在数据到达时为每一行创建一个DOM元素(通过ajax以JSON形式).我发现这对性能更好,然后在后端构建HTML.然后我将元素保存在一个数组中,我只显示可见的行.
对于最大100k行,这只需要几秒钟,但对于500k行(不包括下载),任何更多需要花费一分钟.我想进一步提高性能,所以我尝试使用HTML5 Web Workers.现在的问题是我无法在Web Worker中创建元素,甚至不能在DOM之外创建元素.所以我最终只在Web Workers中进行了json到HTML的转换,并将结果发送到主线程.它在那里创建并存储在一个数组中.不幸的是,这使性能恶化,现在需要至少30秒.
问题:在Web工作者中,在DOM树之外创建DOM元素是否有任何我不知道的方法?如果没有,为什么不呢?在我看来,这不会产生并发问题,因为创建元素可以并行发生而没有问题.
好吧,首先让我说我的时区是CET/CEST.它从CEST变为CET的确切时刻(从DST返回,即GMT + 2,再到正常,GMT + 1,因此)始终是10月的最后一个星期日凌晨3点.2010年10月31日凌晨3点.
现在请注意以下事项:
>>> import datetime
>>> import pytz.reference
>>> local_tnz = pytz.reference.LocalTimezone()
>>> local_tnz.utcoffset(datetime.datetime(2010, 10, 31, 2, 12, 30))
datetime.timedelta(0, 3600)
Run Code Online (Sandbox Code Playgroud)
如上所述,这是错误的.
>>> local_tnz.utcoffset(datetime.datetime(2010, 10, 30, 2, 12, 30))
datetime.timedelta(0, 7200)
>>> local_tnz.utcoffset(datetime.datetime(2010, 10, 31, 2, 12, 30))
datetime.timedelta(0, 7200)
Run Code Online (Sandbox Code Playgroud)
现在它突然变得正确:/
我知道有几个问题已经存在,但给出的解决方案始终是"使用本地化",但我的问题是LocalTimezone不提供该方法.
事实上,我有几个时间戳,以毫秒为单位,我需要本地时区的utcoffset(不仅是我的,而是使用该程序的任何人).其中一个是1288483950000或Sun Oct 31 2010 02:12:30 GMT + 0200(CEST)在我的时区.
目前我执行以下操作来获取datetime对象:
datetime.datetime.fromtimestamp(int(int(millis)/1E3))
Run Code Online (Sandbox Code Playgroud)
这将在几分钟内得到utcoffset:
-int(local_tnz.utcoffset(date).total_seconds()/60)
Run Code Online (Sandbox Code Playgroud)
不幸的是,在很多场合都是错的:(.
有任何想法吗?
注意:我正在使用python3.2.4,而不是在这种情况下它应该是重要的.
编辑:
通过@JamesHolderness找到解决方案:
def datetimeFromMillis(millis):
return pytz.utc.localize(datetime.datetime.utcfromtimestamp(int(int(millis)/1E3)))
def getTimezoneOffset(date):
return -int(date.astimezone(local_tz).utcoffset().total_seconds()/60)
Run Code Online (Sandbox Code Playgroud)
local_tz等于tzlocal模块中的tzlocal.get_localzone().