小编Dav*_*dia的帖子

使用Data URI快速更新图像会导致缓存,内存泄漏

我有一个网页,可以快速从服务器流式传输JSON并显示其中的一些内容,大约10次/秒.一部分是base64编码的PNG图像.我发现了几种不同的显示图像的方法,但是所有这些方法都会导致无限的内存使用.它在几分钟内从50mb上升到2gb.适用于Chrome,Safari和Firefox.没试过IE.

我首先通过查看Activity Monitor.app发现了内存使用情况 - Google Chrome渲染器进程不断地占用内存.然后,我看着Chrome的资源检查器(View> Developer> Developer Tools,Resources),我看到它被缓存的图像.每次我更改img src,或创建一个新的Image()并设置它src,Chrome缓存它.我只能想象其他浏览器也在做同样的事情.

有没有办法控制这个缓存?我可以把它关掉,或做鬼鬼祟祟的事情,这样就不会发生吗?

编辑:我希望能够在Safari/Mobile Safari中使用该技术.此外,如果有人有任何想法,我会对其他快速刷新图像的方法持开放态度.

这是我尝试过的方法.每个驻留在一个在AJAX完成时调用的函数.

方法1 - 直接srcimg标记上设置属性

快速.显示得很好.泄漏就像疯了似的.

$('#placeholder_img').attr('src', 'data:image/png;base64,' + imgString);
Run Code Online (Sandbox Code Playgroud)

方法2 - img用a 替换canvas,并使用drawImage

显示正常,但仍然泄漏.

var canvas = document.getElementById("placeholder_canvas");
var ctx = canvas.getContext("2d");
var img = new Image();
img.onload = function() {
    ctx.drawImage(img, 0, 0); 
}   
img.src = "data:image/png;base64," + imgString;
Run Code Online (Sandbox Code Playgroud)

方法3 - 转换为二进制并替换canvas内容

我在这里做错了 - …

javascript html5 memory-leaks data-uri html5-canvas

25
推荐指数
2
解决办法
1万
查看次数

如何控制gcc/g ++自动包含标题的方式?

过去,当我尝试将一些在Mac OS X上编写的C++代码移植到Linux系统上,或尝试使用较新版本的gcc/g ++旧代版本编写代码时,我遇到了麻烦:

似乎某些(较旧的?)版本的gcc/g ++会自动为您包含一些头文件.

例如,使用的代码printf应该是必需的#include <stdio.h>.使用的代码memcpy应该是必需的#include <string.h>.但根据我正在使用的gcc版本,它偶尔会包含这些内容.

当我忘记包含某些东西然后在我去另一个系统上编译代码之前永远不会出错时,它会造成严重破坏.在那时,它是一个在整个项目中运行并修复包含的游戏.

有没有其他人遇到这个?有没有办法强制gcc自动包含或不自动包含?或者,有没有办法知道它是什么自动包含?

gcc compilation g++ header include

8
推荐指数
2
解决办法
5778
查看次数

从.h文件生成.cpp源代码

.cpp文件的准系统版本通常只是相关头文件的副本,带有一些大括号而不是分号,ClassName::插入几个地方,并删除virtual关键字.其中大部分可以使用单行sed命令生成,但对于所有语言功能(模板都会浮现在脑海中)它不会非常健壮.

在我自己编写之前,是否有任何简单的命令行实用程序将采用我提供的头文件并给我一个骨架.cpp文件,我可以填写空白?

c++ scripting command-line code-generation

7
推荐指数
1
解决办法
1167
查看次数

Linux字符设备驱动程序如何检测使用它的程序何时异常退出?

我有一个Linux字符设备驱动程序,它创建一个/dev/mything条目,然后是一个C++/Qt程序打开设备并使用它.如果该程序正确退出,exit()则关闭设备并且驱动程序正确地重置.但是,如果程序异常退出,通过段错误SIGINT或其他东西,设备未正确关闭.

我目前的解决方法是在驱动程序陷入"打开"状态时重新加载驱动程序.

驱动程序中的这一行试图阻止多个程序同时使用该设备:

int mything_open( struct inode* inode, struct file* filp ) {
    ...
    if ( port->rings[bufcount].virt_addr ) return -EBUSY;
    ...
}
Run Code Online (Sandbox Code Playgroud)

然后这清理它:

int mything_release( struct inode* inode, struct file* filp ) {
    ...
    port->rings[bufcount].virt_addr = NULL;
    ...
}
Run Code Online (Sandbox Code Playgroud)

我认为exit()导致mything_release被召唤但SIGINT不是.如何在这种情况下使驱动程序更加强大?

编辑:

以下是我实施的操作.也许我错过了什么?

static struct file_operations fatpipe_fops = {
    .owner =    THIS_MODULE,
    .open =     mything_open,
    .release =  mything_release,
    .read =     mything_read,
    .write =    mything_write,
    .ioctl =    mything_ioctl
};
Run Code Online (Sandbox Code Playgroud)

c linux file-io driver

6
推荐指数
1
解决办法
1504
查看次数

ioremap 后的内存访问非常慢

我正在开发一个 Linux 内核驱动程序,它为用户空间提供一块物理内存。我有驱动程序的工作版本,但目前速度很慢。所以,我退回了几步,尝试制作一个小巧、简单的驱动程序来重现问题。

我在启动时使用内核参数保留内存memmap=2G$1G。然后,在驱动程序的__init函数中,我ioremap将这些内存中的一部分,并将其初始化为一个已知值。我也输入了一些代码来测量时间:

#define RESERVED_REGION_SIZE    (1 * 1024 * 1024 * 1024)   // 1GB
#define RESERVED_REGION_OFFSET  (1 * 1024 * 1024 * 1024)   // 1GB

static int __init memdrv_init(void)
{
    struct timeval t1, t2;
    printk(KERN_INFO "[memdriver] init\n");

    // Remap reserved physical memory (that we grabbed at boot time)
    do_gettimeofday( &t1 );
    reservedBlock = ioremap( RESERVED_REGION_OFFSET, RESERVED_REGION_SIZE );
    do_gettimeofday( &t2 );
    printk( KERN_ERR "[memdriver] ioremap() took %d usec\n", usec_diff( &t2, &t1 ) );

    // …
Run Code Online (Sandbox Code Playgroud)

memory performance kernel driver linux-kernel

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

作为全局对象的QScriptValue的深层副本

我有一个程序使用QtScript进行一些自动化.我已经在脚本引擎的全局范围中添加了一堆C++函数和类,以便脚本可以访问它们,如下所示:

QScriptValue fun = engine->newFunction( systemFunc );
engine->globalObject().setProperty( "system", fun );
Run Code Online (Sandbox Code Playgroud)

我希望能够连续运行多个脚本,每个脚本都有一个全新的状态.因此,如果一个脚本设置了一个全局变量,比如

myGlobalVar = "stuff";
Run Code Online (Sandbox Code Playgroud)

我希望在下一个脚本运行之前擦除该变量.我这样做的方法是制作脚本引擎的全局对象的深层副本,然后在脚本完成运行时恢复它.但深拷贝不起作用,因为我的system功能突然出现错误:

TypeError: Result of expression 'system' [[object Object]] is not a function.
Run Code Online (Sandbox Code Playgroud)

这是我的深层复制功能,改编自:http:
//qt.gitorious.org/qt-labs/scxml/blobs/master/src/qscxml.cpp

QScriptValue copyObject( const QScriptValue& obj, QString level = "" )
{
    if( obj.isObject() || obj.isArray() ) {
        QScriptValue copy = obj.isArray() ? obj.engine()->newArray() : obj.engine()->newObject();
        copy.setData( obj.data() );
        QScriptValueIterator it(obj);
        while(it.hasNext()) {
            it.next();
            qDebug() << "copying" + level + "." + it.name();
            if( it.flags() & QScriptValue::SkipInEnumeration ) …
Run Code Online (Sandbox Code Playgroud)

c++ qt qtscript

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

内存泄漏与AJAX请求+ jQuery

我通过AJAX调用反复从服务器获取JSON对象.随着时间的推移,浏览器的内存使用量会增长(尝试使用Chrome,Safari,Firefox).使用Chrome的堆快照,我发现时间戳字符串没有引用.如果我拍摄一系列快照,我会看到字符串的数量不断增加.

$(function() {
    var latestTimestamp = 0;

    function fetchData() {
        $.get("/parameter?format=json&since=" + latestTimestamp, gotData)
    }   

    function gotData(data) {
        latestTimestamp = data['timestamp'];
        setTimeout(fetchData, 250);
    }   

    fetchData();
});
Run Code Online (Sandbox Code Playgroud)

其他说明:

  • 我正在使用jQuery 1.7.1.编辑:刚试过1.6.2和1.4.2,同样的问题.
  • timestamp在JSON对象实际上是一个整数,而不是字符串.那么累积的字符串可能是临时值?
  • + latestTimestamp从AJAX请求中删除会阻止泄漏.
  • 更快的setTimeout(20ms)会导致泄漏更快.我认为快速超时可能是罪魁祸首,所以我把它减少到250毫秒,但这没有用.

ajax jquery json memory-leaks

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

如何与ReactTestRenderer/Jest呈现的组件进行交互

我正在使用Jest和快照测试.我想做的是渲染一个组件ReactTestRenderer,然后模拟单击其中的按钮,然后验证快照.

ReactTestRenderer create调用返回的对象有一个getInstance允许我直接调用其方法的函数,但它似乎不适用于ReactTestUtils中的任何find/scry方法.

我可以手动遍历树并单击按钮,但似乎必须有更好的方法:

import React from 'react';
import ReactDOM from 'react-dom';
import MyCounter from './MyCounter';
import renderer from 'react-test-renderer';
import {Simulate, findRenderedDOMComponentWithClass} from 'react-addons-test-utils';

it('should render 0', () => {
  const component = renderer.create(<MyCounter/>);
  const inst = component.getInstance();

  // Calling methods directly works, but that's not the same as
  // simulating a click on the button...
  inst.increment();

  // This also works, but it's awfully verbose...
  component.toJSON().children[1].props.onClick();

  // I'm looking for something like...
  //   inst.find('.increment').click() …
Run Code Online (Sandbox Code Playgroud)

testing reactjs jestjs

5
推荐指数
2
解决办法
1930
查看次数

在 ffmpeg 中查找时避免复制解码帧

我正在努力使用 ffmpeg 和 libav (使用 C 库,而不是命令行ffmpeg工具)实现精确搜索。

\n

据我了解,获得准确查找的唯一方法是查找最近的(较早的)关键帧,然后解码数据包,直到达到所需的时间戳。我已经使用av_seek_frameAVSEEK_FLAG_BACKWARD标志来工作了。

\n

现在,我知道没有办法解决这个问题,因为视频是如何使用 I、P 和 B 帧进行编码的。

\n

但我正在寻找的是一种方法来告诉 ffmpeg 跳过内存分配和数据复制 \xe2\x80\x93 通过一个标志 to avcodec_receive_frame,也许,或完全另一个函数。有没有办法表明“我不关心实际的帧数据,我只需要解码器来处理这个数据包”?

\n

我的首要目标是尽可能快地进行搜索,因此任何其他类似的建议也将受到欢迎。

\n

ffmpeg libav

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

通过外键约束加强关系?

假设我有以下表格:

问题,选择,答案

每个问题都有很多选择(选择具有question_id外键。)

Answers表具有两个外键question_idchoice_id,并且这些约束可以防止引用不存在的question或的答案choice,但我也想防止无效的选择。

我如何表达一个约束(也许不是正确的词),该约束仅允许答案choice_id是给定的有效选择question_id?例如,如果我有2个问题,每个问题有2个选择:

  • Q1(ID = 1)
    • A(id = 1)
    • B(id = 2)
  • 第2季(id = 2)
    • C(id = 3)
    • D(id = 4)

我想允许像(question_id= 1,choice_id= 1(或2))之类的答案并阻止像(question_id= 1,choice_id= 4)之类的答案,因为这不是问题的有效选择。

sql postgresql database-design many-to-many foreign-keys

2
推荐指数
1
解决办法
49
查看次数