在这个问题,有人建议意见,我应该不会投的结果malloc,即
int *sieve = malloc(sizeof(int) * length);
Run Code Online (Sandbox Code Playgroud)
而不是:
int *sieve = (int *) malloc(sizeof(int) * length);
Run Code Online (Sandbox Code Playgroud)
为什么会这样呢?
这是代码.
首先我尝试malloc并释放一个大块内存,然后我malloc许多小块内存,直到它耗尽内存,我释放所有这些小块.
在那之后,我尝试malloc一个大块内存.
#include <stdio.h>
#include <stdlib.h>
int main (int argc, char **argv)
{
static const int K = 1024;
static const int M = 1024 * K;
static const int G = 1024 * M;
static const int BIG_MALLOC_SIZE = 1 * G;
static const int SMALL_MALLOC_SIZE = 3 * K;
static const int SMALL_MALLOC_TIMES = 1 * M;
void **small_malloc = (void **)malloc(SMALL_MALLOC_TIMES * sizeof(void *));
void *big_malloc = malloc(BIG_MALLOC_SIZE);
printf("big malloc first time %s\n", (big_malloc …Run Code Online (Sandbox Code Playgroud) 这是一个生产PHP/MySQL系统,已经运行了几个月,大多没有问题.
很偶然,就像每隔几周一次,我从MySQL查询中看到"无法保存结果集"错误.
我知道这可能是由一个大的结果集引起的,但事实并非如此.在最近的例子中,它发生在通常不超过10行的小表中(行表示活动游戏,并且在游戏结束后它们被移除 - 大量转换,但总是很小).
查询非常简单:
SELECT player_1_id, player_2_id FROM minuetServer_games
WHERE ( player_1_id = '1513399' OR player_2_id = '1513399' )
AND last_action_time < SUBTIME( CURRENT_TIMESTAMP, '0 0:01:22.000' )
FOR UPDATE;
Run Code Online (Sandbox Code Playgroud)
这个查询的目的是为给定的user_id(它们可以是p1或p2)找到任何不太陈旧的活动游戏.如果存在,我在下一个查询中更新了他们游戏的last_action_time(当然,当未保存结果集时,不会发生更新).
我运行了CHECK TABLE,结果还可以.
虚假,偶尔"无法保存结果集"警告的原因是什么?有办法解决吗?有一个坚实的解决方案吗?
编辑:
一位评论者要求提供有关他PHP配置的更多信息.这是phpinfo()输出的直接链接:
http://cordialminuet.com/info.php
EDIT2:
这是创建查询的代码:
global $tableNamePrefix;
cm_queryDatabase( "SET AUTOCOMMIT=0" );
global $moveTimeLimit;
$query = "SELECT player_1_id, player_2_id ".
"FROM $tableNamePrefix"."games ".
"WHERE ( player_1_id = '$user_id' OR player_2_id = '$user_id' ) ".
" AND last_action_time < ".
" SUBTIME( CURRENT_TIMESTAMP, '$moveTimeLimit' ) FOR UPDATE;"; …Run Code Online (Sandbox Code Playgroud)