V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  skinny  ›  全部回复第 28 页 / 共 31 页
回复总数  620
1 ... 20  21  22  23  24  25  26  27  28  29 ... 31  
2018-09-26 07:45:02 +08:00
回复了 skinny 创建的主题 Python Python 内存占用也太大了。
@petelin 用 del 是免得和你这类杠精一样硬说有内存泄露。你要是还觉得有内存泄露你自己去写吧。那段代码怎么简单怎么来,免得优雅了你们又要说内存泄露。
2018-09-26 07:42:00 +08:00
回复了 skinny 创建的主题 Python Python 内存占用也太大了。
@slixurd 他们一些人是在捏造论点并攻击,没有一个跟我吐槽相关(推荐 hdf5 之类优秀库的除外),你反驳就是杠精、沟通能力、理解能力差,你说到底谁杠精、理解能力差?如果我一开始不说使用场景,他们要喷我什么也不说就瞎说,我说了又扣了个字眼说我不会用,回他们换成别的也可以,然后又说不给真实测试数据和代码,让他们随便塞按描述生成的那么 3000 万条到内存试试就成,range 总会用吧,我都不强求你怎么样了,然后又说我表达能力差。话说我跟他们兜什么圈子,内存占用、对象大小不是明摆着的么!跟杠精争什么!我本来就是吐个槽而已。
2018-09-25 19:29:43 +08:00
回复了 skinny 创建的主题 Python Python 内存占用也太大了。
自己立一个靶子来攻击,然后我反驳就说我是杠精,也没谁了,你们爱怎么看怎么看吧。

最后:
https://stackoverflow.com/a/30316760
2018-09-25 19:23:53 +08:00
回复了 skinny 创建的主题 Python Python 内存占用也太大了。
@wutiantong

你也可以完全不用 pickle 来测试,测试数据你可以简单先生成 3000 万条长度为 3-32 的 ascii printable 字符串(我这最长的一条有 95 个字节,不过非常非常少,多是 6 到 12 个字节的),重复数据条数占 24%,重复数据你随机插入,生成的字符串作为 K,V 你可以随机产生 1 到 2000 万之间的值,,生成测试数据要花时间,你也可以用更好的办法。

说实在的,我一开始就是吐槽 Python 对象内存占用大。

为了避免有人硬说内存泄露,你可以用如下代码(结果一样,内存需要非常多):

```python

# Version: Python 3.6.6 x64

import collections
import glob

counter = collections.Counter()
# 你也可以直接用 dict
# counter = dict()

for path in glob.glob(r'F:\TestData\*.txt'):
with open(path, encoding='UTF-8') as input_stream:
for line in input_stream:
tmp = line.rstrip()
k, v = tmp.rsplit('\t', maxsplit=1)
c = int(v)
del v
del tmp

counter[k] += c

# n = counter.get(k, 0)
# counter[k] = c + n
```

我用.net core 按相似的方法实现了一遍,速度很快,内存占用 3GB:

```c#
// .net core 2.1
//
// Program.cs build options: Release, x64

using System;
using System.Collections.Generic;
using System.IO;
using System.Text;

namespace db_conv_cs
{
class Program
{
static void Main(string[] args)
{
Dictionary<string, uint> counter = new Dictionary<string, uint>();

string[] files = new string[]
{
@"F:\TestData\dat-1.txt",
@"F:\TestData\dat-2.txt",
@"F:\TestData\dat-3.txt",
@"F:\TestData\dat-4.txt",
@"F:\TestData\dat-5.txt"
};

foreach (string path in files)
{
InsertItems(path, counter);
}

Console.WriteLine("{0} items", counter.Count);
}

static void InsertItems(string path, Dictionary<string, uint> counter)
{
FileStream file = new FileStream(path, FileMode.Open, FileAccess.Read);
StreamReader reader = new StreamReader(file, Encoding.UTF8);
string line = null;

while ((line = reader.ReadLine()) != null)
{
line = line.TrimEnd('\r', '\n');

int i = line.LastIndexOf('\t');

if (i == 0)
{
continue;
}

string k = line.Substring(0, i);
string v = line.Substring(i + 1);
uint n = uint.Parse(v);

uint c = 0;
counter.TryGetValue(k, out c);
counter[k] = c + n;
}

reader.Close();
file.Close();
}
}
}
```
2018-09-25 15:57:50 +08:00
回复了 skinny 创建的主题 Python Python 内存占用也太大了。
@lihongjie0209 追加里再次那么细致的说了数据类型、大小、数量、结构,眼神不好?你要不然按#28 楼说的用 range 生成一批数据测试,也没人说你,是不?
2018-09-25 15:54:54 +08:00
回复了 skinny 创建的主题 Python Python 内存占用也太大了。
@hahastudio 刚刚验证了你发的那个链接,按那个解决方法试了,结果还是一样。实际上就是太多小对象,Python 对象底层数据结构又比较大。
2018-09-25 15:36:54 +08:00
回复了 skinny 创建的主题 Python Python 内存占用也太大了。
@laike9m 实际是用 C 根本没问题,顶天了 600MB 左右(粗糙 dict 实现),因为实际数据才 400MB 左右,我吐槽的是内存占用,我根本不在乎快到几分钟内完成,只要在半小时内搞定,不影响我同时在进行的编码任务就行,只要不是过高的 CPU 使用率或是内存占用高到导致其它操作(如编码)不能正常进行就行。一开始我是觉得没问题才这样做的,要是考虑算法,我干嘛用 collections.Counter。
2018-09-25 15:22:52 +08:00
回复了 skinny 创建的主题 Python Python 内存占用也太大了。
@hahastudio 我知道高级语言会比 C 之类占用更多内存,我没有觉得有什么,一开始有心理准备,我粗糙的设计了下 C 的数据结构,预估了内存占用,然后看 pickle 文件和实际数据都不大,全部变成 Python 对象 collections.Counter[str, int]应该可以接受几倍的内存占用,当时我觉得 3GB 到 4GB 内存是可以搞定的,结果没想到爆了。我有考虑不周和偷懒的问题不存在,甚至还有穷的问题存在,不过一些人不知道他们到底在 diss 什么。
2018-09-25 15:07:34 +08:00
回复了 skinny 创建的主题 Python Python 内存占用也太大了。
@nooper 下次遇到相同问题用这个。
2018-09-25 15:06:47 +08:00
回复了 skinny 创建的主题 Python Python 内存占用也太大了。
@kernel 我也是第一次遇到。

@zhzer 是该大一些,我主贴里一开始是吐槽大得超过预期,只是一些人立了些莫名其妙的靶子来 diss 我。
2018-09-25 13:42:32 +08:00
回复了 skinny 创建的主题 Python Python 内存占用也太大了。
@kernel 他们不会去试的。
2018-09-25 13:41:08 +08:00
回复了 skinny 创建的主题 Python Python 内存占用也太大了。
@billgreen1 我从头到尾没有问问题,只是就使用体验的吐槽而已。
@wutiantong 你这更加莫名其妙了,从头到尾没有 pickle 什么事情,我主贴里说了,吐槽的是本来不大的数据,载入转换成 Python 对象以后翻了很多翻,究竟是谁沟通能力、理解能力堪忧?
2018-09-25 11:30:39 +08:00
回复了 skinny 创建的主题 Python Python 内存占用也太大了。
@est 你这人真是莫名其妙,我从来就没说 pickle 什么事,我只说了 Python 对象内存占用多,对象 load 以后是 Counter 对象,你是不是还要说我不会用 Counter ? Counter 是 dict 子类,是不是还要说我不会用 dict ? dict 里存了太多文本是不是还得说我不会用 str ?
2018-09-25 11:18:12 +08:00
回复了 skinny 创建的主题 Python Python 内存占用也太大了。
@lihongjie0209 用了,太慢了。
2018-09-25 10:50:43 +08:00
回复了 skinny 创建的主题 Python Python 内存占用也太大了。
@simonliu2018
@LokiSharp

知道会内存使用会变得多,没想到的是会这么多,差不多是实际数据的十几倍,预估错了所以没有用 C。
2018-09-25 10:47:52 +08:00
回复了 skinny 创建的主题 Python Python 内存占用也太大了。
@shyling
@xiaoheijw

我写的一次性处理脚本,以前处理的都是以行或块为单位的,这次第一次处理全部都需要载入处理的,看文件不大,就用了标准库,没想到内存占用大得离谱。
我用了几个月了,此外还用 searx,不过 duckduckgo 和 searx 搜索有的关键词就是没有 Google 好,不是结果少、不准确,就是干脆没有结果,前天搜索啥来着就没有结果,用 Google 立马就找到了。
2018-09-19 08:17:35 +08:00
回复了 alwayshere 创建的主题 程序员 有没有一种方法, js 阻止用户截图?
C 都没办法,凭什么你认为 JS 可以?
2018-09-16 10:37:47 +08:00
回复了 ericgui 创建的主题 程序员 今天开始学日语了
@xy90321 你以为外国人(甭管哪国)就没有口音了?连中国人普通话只要不是主播级新闻播音员级别都多少有口音。难道遇到个有口音的讲普通话的就觉得是个外国人?倒是日常习惯和打扮比较容易透出是哪国人,所谓标准口音是人们逼走初学者一个非常好的方法,实际上基本没有参考价值。你们想想印度人那么重口音,不是照样在微软那些大公司当高管,所以别太在意口音是不是标准的,当然了,口音尽量清晰标准有助于沟通和背单词。
2018-09-15 07:42:43 +08:00
回复了 Deville 创建的主题 新手求助 选 Java 还是 Python
Python 有那么难?两个都学呗,多大事儿。

现在 Python 主要都是机器学习、人工智能相关、数据处理,还有运维。
1 ... 20  21  22  23  24  25  26  27  28  29 ... 31  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3912 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 20ms · UTC 10:24 · PVG 18:24 · LAX 02:24 · JFK 05:24
Developed with CodeLauncher
♥ Do have faith in what you're doing.