我们编写了最简单的TCP服务器(带有次要日志记录)来检查内存占用(请参阅下面的tcp-server.go)
服务器只接受连接而不执行任何操作.它运行在Ubuntu 12.04.4 LTS服务器(内核3.2.0-61-generic)上,Go版本为go1.3 linux/amd64.
附加的基准测试程序(pulse.go)在此示例中创建10k连接,在30秒后断开它们,重复此循环三次,然后连续重复1k连接/断开的小脉冲.用于测试的命令是./pulse -big = 10000 -bs = 30.
第一个附加图是通过记录runtime.ReadMemStats获得的,当客户端数量已经改变了500的倍数时,第二个图形是服务器进程的"顶部"看到的RES内存大小.
服务器的内存可以忽略不计1.6KB.然后,内存由10k连接的"大"脉冲设置在~60MB(如上图所示),或者由ReadMemStats看到的大约16MB"SystemMemory".正如预期的那样,当10K脉冲结束时,使用中的内存会下降,最终程序开始将内存释放回OS,如灰色的"释放内存"行所示.
问题是系统内存(相应地,"顶部"看到的RES内存)从未显着下降(尽管它下降了一点,如第二张图所示).
我们可以预期,在10K脉冲结束后,内存将继续释放,直到RES大小是处理每个1k脉冲所需的最小值(由"top"看到的是8m RES,运行时报告的是2MB在使用中.ReadMemStats ).相反,RES保持在大约56MB,并且在使用中永远不会从最高值60MB下降.
我们希望确保不规则流量的可扩展性,偶尔会出现峰值,并且能够在不同时间出现峰值的同一个盒子上运行多个服务器.有没有办法有效地确保在合理的时间范围内尽可能多地将内存释放回系统?


代码https://gist.github.com/eugene-bulkin/e8d690b4db144f468bc5:
server.go:
package main
import (
"net"
"log"
"runtime"
"sync"
)
var m sync.Mutex
var num_clients = 0
var cycle = 0
func printMem() {
var ms runtime.MemStats
runtime.ReadMemStats(&ms)
log.Printf("Cycle #%3d: %5d clients | System: %8d Inuse: %8d Released: %8d Objects: %6d\n", cycle, num_clients, ms.HeapSys, ms.HeapInuse, ms.HeapReleased, ms.HeapObjects)
}
func handleConnection(conn net.Conn) {
//log.Println("Accepted connection:", conn.RemoteAddr())
m.Lock()
num_clients++
if …Run Code Online (Sandbox Code Playgroud) 我有大量的文本,每个文本都在快速增长.我需要实现相似性搜索.
我们的想法是将每个单词嵌入为word2vec,并通过向量添加每个单词的嵌入来将每个文本表示为标准化向量.随后对文本的添加只会通过向其添加新的单词向量来优化结果文本的向量.
是否可以通过在文档中仅存储每个文本的规范化向量的坐标来使用弹性搜索来进行余弦相似性?如果是这样,这种搜索的正确索引结构是什么?
我有一个文档集合,每个文档都随着时间的推移而快速增长.任务是在任何固定时间找到类似的文件.我有两种可能的方法:
矢量嵌入(word2vec,GloVe或fasttext),对文档中的单词矢量求平均,并使用余弦相似度.
词袋:tf-idf或其变体,如BM25.
其中一个会产生明显更好的结果吗?是否有人对文件相似性进行了tf-idf与平均word2vec的定量比较?
是否有另一种方法,允许在添加更多文本时动态优化文档的向量?
我正在编写一个生成多个C线程的C程序,每个线程一个Python子解释器。子解释器不共享任何可变的Python变量,它们彼此隔离。(它们确实对从C程序的main()函数公开的公共PyObject(不可变)具有只读访问权限)。
在子解释器之间不共享GIL的情况下,是否可以在Python 3.7或3.8中实现?
这是我一直在尝试的伪代码:
void *spawnInterpreter(void* p) {
…
PyThreadState* save_tstate = PyThreadState_Swap(NULL);
PyThreadState* tstate = Py_NewInterpreter();
PyThreadState_Swap(save_tstate);
//do some Python work (with variables that are NOT shared with other thread’s sub-interpreter
PyRun_SimpleString( . . .);
. . .
}
int main() {
...
pthread_create(&thread1, NULL, spawnInterpreter, “in1”);
pthread_create(&thread2, NULL, spawnInterpreter, "in2");
...
}
Run Code Online (Sandbox Code Playgroud)
我可以使它在3.6中工作(无需获取GIL或PyThreadState在C线程中进行管理),但是在Python 3.7中,我得到了:
[New Thread 0x7ffff5f78700 (LWP 16392)]
Fatal Python error: drop_gil: GIL is not locked
Run Code Online (Sandbox Code Playgroud) 我正在尝试为 Python3 编写一个简单的 C 扩展,当我尝试将字符串添加到字典时它会出现段错误。这是我的代码:
#include <stdio.h>
#include <Python.h>
int main() {
PyObject* dict_p = PyDict_New();
char *val = "idjewijjd";
PyObject* val_p = PyUnicode_FromString(val);
const char *key = "dhsjdshj";
for (int j=0; j<8; j++) {
printf("%d\n", PyUnicode_READ_CHAR(val_p,j));
}
int r = PyDict_SetItemString(dict_p, key, val_p);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我像这样编译gcc t.c $(python3-config --includes --libs) 并运行它。我得到以下输出:
$ ./a.out
105
100
106
101
119
105
106
106
Segmentation fault (core dumped)
Run Code Online (Sandbox Code Playgroud)
这是 gdb 回溯:
Program received signal SIGSEGV, Segmentation fault.
0x00007ffff78d9b38 in PyUnicode_InternInPlace …Run Code Online (Sandbox Code Playgroud)