{"record":{"id":"94b8b7b13c2172f5","repo":"languagetool-org/languagetool","slug":"too-many-lemmas-value-size-max-le","errorCode":null,"errorMessage":"Too many lemmas (\" + value.size() + \" > \" + MAX_LENGTH + \" for \" + entry.getKey() + \"), the storage needs adjusting","messagePattern":"Too many lemmas \\(\" \\+ value\\.size\\(\\) \\+ \" > \" \\+ MAX_LENGTH \\+ \" for \" \\+ entry\\.getKey\\(\\) \\+ \"\\), the storage needs adjusting","errorType":"exception","errorClass":"UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"languagetool-core/src/main/java/org/languagetool/tagging/ManualTagger.java","lineNumber":75,"sourceCode":"\n  public ManualTagger(InputStream inputStream) throws IOException {\n    this(inputStream, false);\n  }\n\n  public ManualTagger(InputStream inputStream, boolean internTags) throws IOException {\n    Map<String, List<TaggedWord>> mapping = loadMapping(inputStream, internTags);\n    map = new Object2IntOpenHashMap<>(mapping.size());\n    int valueCount = mapping.values().stream().mapToInt(v -> v.size()).sum();\n    int firstIndex = ENTRY_SIZE; // skip an entry, as 0 means an absent value in TObjectIntHashMap\n    data = new String[valueCount * ENTRY_SIZE + firstIndex];\n    if (valueCount > MAX_OFFSET) {\n      throw new UnsupportedOperationException(\"Too many values (\" + valueCount + \"), the storage needs adjusting\");\n    }\n    int index = firstIndex;\n    for (Map.Entry<String, List<TaggedWord>> entry : mapping.entrySet()) {\n      List<TaggedWord> value = entry.getValue();\n      if (value.size() > MAX_LENGTH) {\n        throw new UnsupportedOperationException(\n          \"Too many lemmas (\" + value.size() + \" > \" + MAX_LENGTH + \" for \" + entry.getKey() + \"), the storage needs adjusting\");\n      }\n      map.put(entry.getKey(), ((index / ENTRY_SIZE) << OFFSET_SHIFT) | value.size());\n      for (TaggedWord tw : value) {\n        data[index++] = intern(tw.getLemma());\n        data[index++] = intern(tw.getPosTag());\n      }\n    }\n  }\n\n  private static Map<String, List<TaggedWord>> loadMapping(InputStream inputStream, boolean internTags) throws IOException {\n    Map<String, List<TaggedWord>> map = new HashMap<>();\n    try (\n      InputStreamReader reader = new InputStreamReader(inputStream, StandardCharsets.UTF_8);\n      BufferedReader br = new BufferedReader(reader)\n    ) {\n      String line;\n      int lineCount = 0;","sourceCodeStart":57,"sourceCodeEnd":93,"githubUrl":"https://github.com/languagetool-org/languagetool/blob/2e990059ce67d5e2a0f7f7ca5d31160c6709df4b/languagetool-core/src/main/java/org/languagetool/tagging/ManualTagger.java#L57-L93","documentation":"Per-entry capacity guard during ManualTagger construction: a single inflected form maps to more lemmas than MAX_LENGTH allows, which the packed data array cannot store for that entry. Fires when one word form in the manual tagging file has an implausibly large number of lemma+POS pairs, usually indicating malformed or duplicated lines.","triggerScenarios":"Thrown at languagetool-core/src/main/java/org/languagetool/tagging/ManualTagger.java:75 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Check the manual additions file for the offending word form and remove duplicate/malformed lemma lines","Split entries across distinct word forms or reduce the number of lemmas for that form","Raise MAX_LENGTH in ManualTagger if legitimately more lemmas are needed"],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"2e990059ce67d5e2a0f7f7ca5d31160c6709df4b","analyzedAt":"2026-09-06T09:20:17.015Z","contentChangedAt":"2026-09-06T09:20:17.015Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}