相关疑难解决方法(0)

需要一种按日期对100 GB日志文件进行排序的方法

所以,由于一些奇怪的原因,我最终得到一个100GB的未分类日志文件(实际上它是部分排序的),而我试图应用的算法需要排序数据.日志文件中的一行看起来像这样

data <date> data data more data
Run Code Online (Sandbox Code Playgroud)

我可以在工作站上访问C#4.0和大约4 GB的RAM.我认为合并 - 某种类型在这里最好,但是我自己实现这些算法还不够 - 我想问一下我是否可以采取某种捷径.

顺便说一句,解析日期字符串DateTime.Parse()非常慢,占用了大量的CPU时间 - chugging -rate几乎是10 MB /秒.有比以下更快的方式吗?

    public static DateTime Parse(string data)
    {            
        int year, month, day;

        int.TryParse(data.Substring(0, 4), out year);
        int.TryParse(data.Substring(5, 2), out month);
        int.TryParse(data.Substring(8, 2), out day);

        return new DateTime(year, month, day);
    }
Run Code Online (Sandbox Code Playgroud)

我写道,为了加快速度DateTime.Parse(),它确实运行良好,但仍然需要大量的循环.

请注意,对于当前的日志文件,我也对小时,分钟和秒感兴趣.我知道我可以使用格式提供DateTime.Parse(),但这似乎并没有加快它的速度.

我正在寻找正确方向的推动,提前谢谢.

编辑:有些人建议我使用字符串比较来比较日期.这适用于排序阶段,但我确实需要解析算法的日期.我仍然不知道如何在4GB的免费RAM上对100GB文件进行排序,而无需手动操作.

编辑2:嗯,多亏了我使用windows排序的一些建议,我发现Linux上有类似的工具.基本上你叫sort,它会为你修复一切.正如我们所说,它正在做一些事情,我希望它能尽快结束.我正在使用的命令是

sort -k 2b 2008.log > 2008.sorted.log
Run Code Online (Sandbox Code Playgroud)

-k指定我要对第二行进行排序,第二行是通常YYYY-MM-DD hh:mm:ss.msek格式的日期时间字符串.我必须承认,man-pages缺乏解释所有选项,但我通过运行找到了很多例子info coreutils …

c# sorting date-sorting

33
推荐指数
5
解决办法
9364
查看次数

Python:如何将巨大的文本文件读入内存

我在带有1GB RAM的Mac Mini上使用Python 2.6.我想读一个巨大的文本文件

$ ls -l links.csv; file links.csv; tail links.csv 
-rw-r--r--  1 user  user  469904280 30 Nov 22:42 links.csv
links.csv: ASCII text, with CRLF line terminators
4757187,59883
4757187,99822
4757187,66546
4757187,638452
4757187,4627959
4757187,312826
4757187,6143
4757187,6141
4757187,3081726
4757187,58197
Run Code Online (Sandbox Code Playgroud)

因此文件中的每一行都包含两个以逗号分隔的整数值的元组.我想读取整个文件并根据第二列对其进行排序.我知道,我可以在不将整个文件读入内存的情况下进行排序.但我认为对于一个500MB的文件,我仍然可以在内存中进行,因为我有1GB可用.

但是当我尝试读取文件时,Python似乎分配的内存比磁盘上的文件所需的内存多得多.因此,即使使用1GB的RAM,我也无法将500MB的文件读入内存.我用于读取文件和打印有关内存消耗的信息的Python代码是:

#!/usr/bin/python
# -*- coding: utf-8 -*-

import sys

infile=open("links.csv", "r")

edges=[]
count=0
#count the total number of lines in the file
for line in infile:
 count=count+1

total=count
print "Total number of lines: ",total

infile.seek(0)
count=0
for line in infile:
 edge=tuple(map(int,line.strip().split(","))) …
Run Code Online (Sandbox Code Playgroud)

python memory sorting large-files

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

标签 统计

sorting ×2

c# ×1

date-sorting ×1

large-files ×1

memory ×1

python ×1