【发布时间】:2020-11-30 10:34:43
【问题描述】:
我将每行 1(不是第 0 行)实现为来自 2 个文件(第一个 ~30MB 和第二个 ~50MB)的字符串,其中第 0 行只有一些我不需要 atm 的信息。第 1 行是一个字符串数组,其中包含大约 1.3E6 个较小的数组,例如 ['I1000009', 'A', '4024', 'A'] 作为信息。
[[['I1000009', 'A', '4024', 'A'], ['I1000009', 'A', '6734', 'G'],...],[['H1000004', 'B', '4024', 'A'], ['L1000009', 'B', '6734', 'C'],...],[and so on],...]
两个文件都以相同的方式填充。这就是文件大小在 30 到 50MB 之间的原因。我用我的 .py 脚本读取了这些文件,以访问我需要的单个信息:
import sys
myID = sys.argv[1]
otherID = sys.argv[2]
samePath = '/home/srv/Dokumente/srv/'
FolderName = 'checkArrays/'
finishedFolder = samePath+'finishedAnalysis/'
myNewFile = samePath+FolderName+myID[0]+'/'+myID+'.txt'
otherFile = samePath+FolderName+otherID[0]+'/'+otherID+'.txt'
nameFileOKarray = '_array_goodData.txt'
import csv
import os
import re #for regular expressions
# Text 2 - Start
import operator # zum sortieren der csv files
# Text 2 - End
whereIsMyArray = 1
text_file = open(finishedFolder+myID+nameFileOKarray, "r")
line = text_file.readlines()[whereIsMyArray:];
myGoodFile = eval(line[0])
text_file.close()
text_file = open(finishedFolder+otherID+nameFileOKarray, "r")
line = text_file.readlines()[whereIsMyArray:];
otherGoodFile = eval(line[0])
text_file.close()
print(str(myGoodFile[0][0][0]))
print(str(otherGoodFile[0][0][0]))
我的问题是,如果我在 shell 上启动我的 .py 脚本:
python3 checkarr_v1.py 44 39
我的 4GB pi 服务器的 RAM 增加到 RAM 的限制并交换并死掉。然后我尝试在 32Gb RAM 服务器上启动 .py 脚本并查看它是否有效,但 RAM 的使用量确实很大。看图片
(松弛模式)RAM和CPU的正常使用概述: slackmode
(startsequence) RAM ~6GB 和 CPU 最高使用率概览:highest point
然后它会在约 1 分钟后上下波动:1.2Gb 到 3.6Gb,然后到 1.7Gb,然后到 1Gb,然后脚本完成约 1 分钟并显示正确的输出。
您能否帮助我了解是否有更好的方法来解决 4Gb 覆盆子 pi 的问题?这是编写 2 个文件的更好方法吗,因为 [",] 符号在文件中也有空格?这是一个更好的解决方案,因为 eval 函数是将字符串实现为数组吗?我不明白为什么 80MB 文件将 RAM 增加到 6Gb 左右。这听起来我做错了什么。br thx
【问题讨论】:
-
您不能在 50 MB 的文本文件中包含 1.3E9 个项目。即使每个元素只有 1 个字节加上一个逗号,也就是 2.6GB。
-
@MauriceMeyer 非常感谢。这很有帮助。也许我必须重新考虑我使用 python 的概念
-
@ThomasWeller 我不知道你在计算什么,但我有一个 50Mb 的文件,其中包含 1.3E9 ['fist','A','B','C'] 数组信息。
-
1E3 是 1000 或 k,1E6 是 1000*1000 或一百万或 M,1E9 是 1000*1000*1000 或十亿或 G。要么是误解,要么你有一个 NTFS 压缩文件和您正在查看压缩文件的大小。
-
@ThomasWeller 当然......现在我看到了我的失败。 1.3E6 不是 9. sry :)