V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  skinny  ›  全部回复第 26 页 / 共 30 页
回复总数  587
1 ... 18  19  20  21  22  23  24  25  26  27 ... 30  
2018-10-07 08:42:00 +08:00
回复了 bethebetter 创建的主题 程序员 谷歌 Chrome 默认开启了一个 ping 属性,跟踪用户
@bethebetter 你操作系统都不可信了(因为用户安装的第三方国产软件有管理员权限可以更改系统证书),这种情况下,你觉得有任何软件可以保证信息、隐私安全?
2018-09-28 15:21:48 +08:00
回复了 MrXiong 创建的主题 Java Java 从 jdk9 就删除了 jre,是不是以后想运行 Java 程序都得装 jdk?
2018-09-28 15:21:27 +08:00
回复了 MrXiong 创建的主题 Java Java 从 jdk9 就删除了 jre,是不是以后想运行 Java 程序都得装 jdk?
Windows 下都有啊,其它平台的 JRE 在 Oracle 网站也有单独的下载啊。
2018-09-27 10:25:55 +08:00
回复了 skinny 创建的主题 Python Python 内存占用也太大了。
@jswangjieda 估计等下要杠你了
2018-09-27 09:55:02 +08:00
回复了 skinny 创建的主题 Python Python 内存占用也太大了。
@clino 太麻烦,且主要是代码太简单。还有吐槽下主贴有支持 markdown,回复却不支持,还要删除回复全部行首空格。
2018-09-27 09:51:34 +08:00
回复了 skinny 创建的主题 Python Python 内存占用也太大了。
@jswangjieda 我一开始没有直接去和 java,c 之类的语言对比,我开始说的是 Python 内存占用远远超过预估,所以吐槽了下 Python 内存占用太多(就这次的经验来看,大量小数据(超千万)不适合用标准库和内置容器对象)。可是炸出来一群杠精,所以才有后面别的语言的处理代码和结果。

@newghost Java 分配 3.5GB 内存可以搞定的,就是 CPU 使用率有点高。
2018-09-26 09:33:25 +08:00
回复了 skinny 创建的主题 Python Python 内存占用也太大了。
@petelin 你们是不是扛得精神分裂,最后开始扛自己了。我标题就说得是 Python 太占内存,主贴里也是吐槽的这个,甚至描述都可以让你们生成数据测试。你们开始硬是说什么我不会用 pickle,然后又硬说 pickle 内存泄露,那人写了个测试说 pickle 没有泄露,然后我进一步遂了你们的心,压根儿不用 pickle,再次强调了数据生成和给了新的测试代码,你们照这个试试再杠?
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 ?
1 ... 18  19  20  21  22  23  24  25  26  27 ... 30  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1011 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 19ms · UTC 20:28 · PVG 04:28 · LAX 13:28 · JFK 16:28
Developed with CodeLauncher
♥ Do have faith in what you're doing.